我们有一些脚本可以执行
之类的操作e=$?
if [[ $e == 123 ]]; then exit 1; fi
他们比这更复杂,这只是一个例子。我的问题是使用可以接受的双括号以这种方式进行数值比较,有任何缺点吗?我认为它应该是双括号if (( $e == 123 ))
,但我不想改变很多脚本。
由于
答案 0 :(得分:2)
有很多 key 差异,因为==
检查确切的字符串相等,但-eq
在检查相等性之前以算术方式计算两个表达式。
$ [[ " 1 " -eq 1 ]] && echo equal || echo not
equal
$ (( " 1 " == 1 )) && echo equal || echo not
equal
$ [[ " 1 " = 1 ]] && echo equal || echo not
not
此外,空字符串恰好在数字上等于零:
$ [[ "" -eq 0 ]] && echo equal || echo not
equal
$ [[ "" == 0 ]] && echo equal || echo not
not
当你带上比较运算符时,会出现另外一类差异 - 例如<
vs -lt
:
$ [[ 2 -lt 10 ]] && echo less || echo not
less
$ (( 2 < 10 )) && echo less || echo not
less
$ [[ 2 < 10 ]] && echo less || echo not
not
这是因为字符串2
按字母顺序排在字符串10
之后(因为1
位于2
之前),但数字2
在数字上较少而不是数字10
。
对原始跨网站重复的信用,只有一些更新Is there any major difference when comparing a variable as a string or as an int?
$((..))
进行算术比较严格,以避免将操作数解释为字符串。