2013-04-12 43 views
24

所以我想根據主機設置不同的路徑,但不幸的是它不工作。這裏是我的腳本:

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

這是發生了什麼:

-bash: [foo: command not found 
failure 

我肯定知道$ HOSTNAME是foo,所以我不知道是什麼問題。雖然我對bash很新穎。任何幫助,將不勝感激!謝謝!

+2

提示:shell是空白敏感的。 '[x'與[x'不同。 – Jens

+2

提示:字符串相等的測試運算符是'=',而不是'==',即使後者被錯誤的外殼接受,也會導致程序員的錯誤消息減少。 – Jens

回答

41

的POSIX和便攜的方式在外殼比較字符串是

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

case語句可能會更加靈活,雖然:

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

一兩個等於? – fedorqui

+1

一個,只有一個。這是POSIX。其他任何東西都是一個虛假的外殼,接受超過它應該的,促進'=='不順從的腳本疾病。 – Jens

+0

Uhms,有趣。我更新我的答案以反映這一點。 – fedorqui

0

您在前面的括號後缺少一個空格。這也是很好的「不解析」變量內容用雙引號:

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

雙'=='是一個錯誤。等號運算符是'='。有些shell只接受它,因爲普遍的無知:-) – Jens

+0

你說得對,它不是100%POSIX正確的,但我總是傾向於使用==,如果它工作。 – Danstahr

+0

你應該重新思考「如果有效」的態度。它不會在許多流行的shell上運行,而自從時代以來,它將在任何Unix上運行。有一天,你會發現自己在這樣一個系統。曾聽說過Solaris?和==相比,==甚至更少。 – Jens