我已經定義了以下變量:如何在bash中的if塊中評估布爾變量?
myVar=true
現在我想運行沿此線的東西:
上面的代碼的工作,但如果我嘗試設置
myVar=false
它仍然會輸出true。 可能是什麼問題?
編輯:我知道我可以做形式
if [ "$myVar" = "true" ]; then ...
的東西,但它是有點尷尬。
感謝
我已經定義了以下變量:如何在bash中的if塊中評估布爾變量?
myVar=true
現在我想運行沿此線的東西:
上面的代碼的工作,但如果我嘗試設置
myVar=false
它仍然會輸出true。 可能是什麼問題?
編輯:我知道我可以做形式
if [ "$myVar" = "true" ]; then ...
的東西,但它是有點尷尬。
感謝
的bash不知道布爾變量,也不test
(這是當你使用[
什麼被調用)。
一個解決辦法是:
if $myVar ; then ... ; fi
因爲true
和false
是分別返回0
或1
這是什麼if
期望的命令。
請注意,值是「交換」。在if
之後的命令必須在成功時返回0
,而0
在大多數編程語言中表示「假」。
安全警告:這是可行的,因爲BASH擴展變量,然後嘗試執行結果作爲命令!確保變量不能包含像rm -rf /
+1打我到衝牀,並有一個很好的解釋:-) – 2010-09-28 08:03:36
可能會添加不要忘記'; fi'結尾。所以它是'如果$ myVar;然後 ... ; fi' – IanBussieres 2013-11-05 16:53:10
和'if! $ myVar;然後 ... ; fi'給出了相反的結果 – Pancho 2014-08-18 22:07:57
注意,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
解決方案也可以在沒有分叉的情況下處理。
'true'和'false'是大多數shell中的內置命令。調用它們不會需要fork()調用。 – 2015-09-22 17:40:50
另請參閱:http://stackoverflow.com/questions/2953646/how-to-declare-and-use-boolean-variables-in-shell-script/21210966#21210966 – 2016-06-14 09:20:45