/bin/sh 比。 /bin/bash

/bin/sh VS. /bin/bash

这是(bash):

if [[ ( $month == 03 || $month == 10 ) && $weekday = "Sun" && $day > 24 ]]

与 (shell) 相同:

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给出的解释外,一个很大的区别是[是一个命令,而[[ ... ]]是一个句法结构,参数扩展的规则是不同的。如果您将变量设置为包含 space 的值,即

,您会看到这一点
month='bogus value'

虽然 [[ .... ]] 计算正确,只是 returns false,因为 bogus value 不等于03,[ 会先扩展 $month 然后你会结束类似

[ bogus value -eq 3 ]

这显然会产生语法错误。因此,如果您使用 [,通常需要引用变量,除非您确定它们不能包含 space.

另一个区别是 -eq 进行数值比较,而 == 进行模式匹配(右侧的通配符扩展)。如果 month 设置为 3,则 -eq 将 return 为真,而 == 将 return 为假。

如果你想在bash中做数值比较,你可以,比如写

if (( month == 3 ))
then
   .... # springtime is coming
fi