/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
这是(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