[英]/bin/sh VS. /bin/bash
這是(bash):
if [[ ( $month == 03 || $month == 10 ) && $weekday = "Sun" && $day > 24 ]]
與(外殼)相同:
if [ $month -eq 03 ] || [ $month -eq 10 ] && [ $weekday = "So" ] && [ $day -gt 24 ]
提前致謝。
它們幾乎是等價的,只是分組不同。 &&
的優先級高於||
, 所以sh
版本等價於
if [[ $month == 03 || ( $month == 10 && $weekday = "Sun" && $day > 24 ) ]]
您需要將[... ]
命令與[[... ]]
中的子表達式類似地分組:
if { [ $month -eq 03 ] || [ $month -eq 10 ]; } && [ $weekday = "So" ] && [ $day -gt 24 ]
除了 Barmer 給出的解釋之外,一個很大的區別是,由於[
是命令,而[[... ]]
是句法結構,因此有關參數擴展的規則是不同的。 如果您將變量設置為包含空格的值,您會看到這一點,即
month='bogus value'
雖然[[.... ]]
評估正確並且只返回false ,因為虛假值不等於 03, [
將首先擴展$month
然后你會結束類似
[ bogus value -eq 3 ]
這顯然會產生語法錯誤。 因此,如果您使用[
,通常需要引用變量,除非您確定它們不能包含空格。
另一個區別是-eq
進行數字比較,而 == 進行模式匹配(右側的通配符擴展)。 如果month
設置為 3, -eq
將返回 true,而==
將返回 false。
如果你想在 bash 中做數值比較,你可以,例如,寫
if (( month == 3 ))
then
.... # springtime is coming
fi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.