2010-09-28 34 views
55

我已經定義了以下變量:如何在bash中的if塊中評估布爾變量?

myVar=true 

現在我想運行沿此線的東西:

​​

上面的代碼的工作,但如果我嘗試設置

myVar=false 

它仍然會輸出true。 可能是什麼問題?

編輯:我知道我可以做形式

if [ "$myVar" = "true" ]; then ... 

的東西,但它是有點尷尬。

感謝

+0

另請參閱:http://stackoverflow.com/questions/2953646/how-to-declare-and-use-boolean-variables-in-shell-script/21210966#21210966 – 2016-06-14 09:20:45

回答

93

的bash不知道布爾變量,也不test(這是當你使用[什麼被調用)。

一個解決辦法是:

if $myVar ; then ... ; fi 

因爲truefalse是分別返回01這是什麼if期望的命令。

請注意,值是「交換」。在if之後的命令必須在成功時返回0,而0在大多數編程語言中表示「假」。

安全警告:這是可行的,因爲BASH擴展變量,然後嘗試執行結果作爲命令!確保變量不能包含像rm -rf /

+0

+1打我到衝牀,並有一個很好的解釋:-) – 2010-09-28 08:03:36

+1

可能會添加不要忘記'; fi'結尾。所以它是'如果$ myVar;然後 ... ; fi' – IanBussieres 2013-11-05 16:53:10

+5

和'if! $ myVar;然後 ... ; fi'給出了相反的結果 – Pancho 2014-08-18 22:07:57

32

注意,if $myVar; then ... ;fi結構有你可能想避免與

case $myvar in 
    (true) echo "is true";; 
    (false) echo "is false";; 
    (rm -rf*) echo "I just dodged a bullet";; 
esac 

你也可能要重新考慮安全問題,惡意代碼,爲什麼會出現if [ "$myvar" = "true" ]尷尬的你。這是一個shell字符串比較,它可能爲了獲取退出狀態而跳過一個進程。叉是一個沉重和昂貴的操作,而字符串比較是廉價的。考慮幾個CPU週期而不是幾千個。我的case解決方案也可以在沒有分叉的情況下處理。

+1

'true'和'false'是大多數shell中的內置命令。調用它們不會需要fork()調用。 – 2015-09-22 17:40:50