2013-04-12 8 views
24

Dlatego chcę ustawić różne ścieżki w zależności od hosta, ale niestety to nie działa. Oto mój skrypt:

if [$HOSTNAME == "foo"]; then 
    echo "success" 
else 
    echo "failure" 
fi 

To co się dzieje:

-bash: [foo: command not found 
failure 

wiem na pewno, że $ HOSTNAME jest foo, więc nie jestem pewien, co jest problem. Jestem jednak całkiem nowy, żeby się spartaczyć. Każda pomoc będzie doceniona! Dzięki!

+2

Podpowiedź: powłoka jest wrażliwa na białe znaki. '[x' różni się od' [x'. – Jens

+2

Podpowiedź: Operatorem testu dla równości łańcuchów jest '=', a nie '==', nawet jeśli ten ostatni jest akceptowany przez błędne powłoki w błędnej próbie ułatwienia programistom mniej komunikatów o błędach. – Jens

Odpowiedz

41

POSIX i przenośny sposób do porównywania ciągów znaków w powłoce jest

if [ "$HOSTNAME" = foo ]; then 
    printf '%s\n' "on the right host" 
else 
    printf '%s\n' "uh-oh, not on foo" 
fi 

Oświadczenie sprawa może być bardziej elastyczny, choć :

case $HOSTNAME in 
    (foo) echo "Woohoo, we're on foo!";; 
    (bar) echo "Oops, bar? Are you kidding?";; 
    (*) echo "How did I get in the middle of nowhere?";; 
esac 
+1

Jeden lub dwa równa się? – fedorqui

+1

Jeden i tylko jeden. To POSIX. Wszystko inne jest fałszywą powłoką, akceptującą więcej niż powinna, promującą "niezgodną" skryptową chorobę. – Jens

+0

Uhm, interesujące. Aktualizuję moją odpowiedź, aby to odzwierciedlić. – fedorqui

0

Brakuje spacji za nawiasem otwierającym. Jest to także dobry „nie do analizowania” zmienną zawartość za pomocą cudzysłowów:

if [ "$HOSTNAME" = "foo" ]; then 
... 
+0

Podwójne '==' jest błędem. Operator równości to '='. Niektóre muszle akceptują je tylko z powodu powszechnej niewiedzy :-) – Jens

+0

Masz rację, że nie jest to w 100% zgodne z POSIX, ale zawsze używam == jeśli to działa. – Danstahr

+0

Powinieneś ponownie przemyśleć postawę "jeśli to działa". Nie będzie działać na wielu popularnych powłokach, podczas gdy = będzie działać wszędzie na dowolnym Uniksie od epoki. Pewnego dnia znajdziesz się w takim systemie. Czy słyszałeś kiedykolwiek o Solarisie? And = jest jeszcze mniej typem niż ==. – Jens

Powiązane problemy