簡體   English   中英

/bin/sh VS. /bin/bash

[英]/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM