2013-04-12 1 views
24

Quindi voglio impostare alcuni percorsi in modo diverso a seconda dell'host, ma sfortunatamente non funziona. Ecco il mio script:

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

Questo è ciò che accade:

-bash: [foo: command not found 
failure 

So per certo che $ HOSTNAME è pippo, quindi non sono sicuro di quale sia il problema. Comunque sono abbastanza nuovo da battere. Qualsiasi aiuto sarebbe apprezzato! Grazie!

+2

Suggerimento: la shell è sensibile agli spazi bianchi. '[x' è diverso da' [x'. – Jens

+2

Suggerimento: l'operatore di test per l'uguaglianza delle stringhe è '=', non '==', anche se quest'ultimo è accettato da shell buggy in un tentativo errato di facilitare i programmatori con meno messaggi di errore. – Jens

risposta

41

Il POSIX e modo portabile per confrontare le stringhe nel guscio è

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

Una dichiarazione caso può essere più flessibile, anche se :

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

Uno o due uguali? – fedorqui

+1

Uno e solo uno. Questo è POSIX. Qualsiasi altra cosa è una shell fasulla, che accetta più di quanto dovrebbe, promuovendo la malattia di script '==' non conforme. – Jens

+0

Uhms, interessante. Aggiorna la mia risposta per riflettere questo. – fedorqui

0

Ti manca uno spazio dopo la parentesi di apertura. E 'anche un bene di "non analizzare" il contenuto variabile utilizzando le virgolette doppie:

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

Double '==' è un bug. L'operatore di uguaglianza è '='. Alcune shell lo accettano solo a causa dell'ignoranza diffusa :-) – Jens

+0

Hai ragione che non è POSIX corretto al 100%, ma tendo sempre a usare == se funziona. – Danstahr

+0

È necessario riconsiderare l'atteggiamento "se funziona". Non funzionerà su molte shell popolari, mentre = funzionerà ovunque su qualsiasi Unix dall'epoca. Un giorno ti troverai su un sistema del genere. Hai mai sentito parlare di Solaris? E = è ancora meno da digitare di ==. – Jens