bash [[进行数值比较?

时间:2017-07-27 06:48:51

标签: bash if-statement

我们有一些脚本可以执行

之类的操作
e=$?
if [[ $e == 123 ]]; then exit 1; fi

他们比这更复杂,这只是一个例子。我的问题是使用可以接受的双括号以这种方式进行数值比较,有任何缺点吗?我认为它应该是双括号if (( $e == 123 )),但我不想改变很多脚本。

由于

1 个答案:

答案 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?

判决是使用$((..))进行算术比较严格,以避免将操作数解释为字符串。