Zobacz wyniki ankiety na temat zarobków programistów w Polsce. Czytaj więcej..
4

Dlaczego dodaje się "x" podczas porównywania łańcuchów znaków w skryptach SH ?

np. "x$1" = "x" ,lub "x$1" = "x-d"

flag

5 Answers

5

Wskazanie "$string" może powodować błąd w niektórych wersjach basha gdy string jest pusty. Dlatego dodawany jest sztuczny znak aby tego uniknąć.

EDIT:

Dodaję źródło : Advanced Bash-Scripting Guide

link|flag
0

A możesz wkleić przykładowy kawałek kodu? Nie bardzo rozumiem co Ci się dodaje i gdzie.

link|flag
1 
Proszę umieszczaj takie uwagi w komentarzach pod pytaniem. :) – rafek Feb 2 at 13:58
0

Na przykład taki kod:

if [ "x$1" = "x-d" -o "x$1" = "x-f" ]; then
    what="$1"
    shift
else
    what=-f
fi
link|flag
2

Wynika to z "dynamicznego" charakteru basha. Dodanie x na początku wymusza porównywanie tekstowe, a nie numeryczne i pozwala uniknąć błędów jak napisał Gandi.

link|flag
1 
Nie do końca, zmienne tekstowe i numeryczne mają różne operatory porównań, np. eq i =. – Gandi Feb 2 at 13:40
-1

Można to zapisać bez doklejania "x" w ten sposób:

if [ $# -eq 0 ] ; then
    # gdy brak parametrów, ustaw domyślny
    what=-f
elif [ "$1" = "-d" -o "$1" = "-f" ]; then
    # gdy pierwszym parametrem jest "-d" lub "-f"
    # ustaw
    what="$1"
    # podbij o 1 parametr
    shift
fi

ale prawdę mówiąc lepiej zapisać parsowanie parametrów tak:

# ustawienia domyślne
# jeśli nie ustawiono $what 
[ -z $what ] && what=-f
# parsowanie parametrów
while [ $# -gt 0 ] ; do
    # ta pętla wykona się tylko jeśli parametry istnieją, 
    # więc żaden "x" nie musi być doklejany
    parametr="$1"
    shift
    case "$parametr" in
    	-f|-d)
    		# przypisane -f lub -d
    		what="$parametr"
    		# podbicie "shift" jest automatycznie o 1
    		# teraz pętla wykona się jeszcze raz 
    		# i przeanalizuje kolejny parametr o ile istnieje
    		;;
    	*)
    		echo "Takiego parametru '$what' nie ma!"
    		exit 1
    		;;
    esac
done

dzięki temu kolejność parametrów staje się dowolna i łatwo dodać następne opcje

link|flag
Ale to nie jest odpowiedź na zadane pytanie. Jeżeli odnosisz się do odpowiedzi Grześka to napisz to w komentarzu. – Gandi Feb 4 at 8:34
W 50% jest. Grzesiek pytał się "po co", a ja odpowiedziałem dlaczego On się pyta skoro można to zrobić bez "x". W każdym bądź razie dzięki za minusa już na samym początku :). – borzole Feb 4 at 11:58

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.