Bash Equality Operators(==, - eq)

时间:2013-12-08 03:29:59

标签: bash

有人可以在bash脚本中解释-eq==之间的区别吗?

以下是否有任何区别?

[ $a -eq $b ]  和[ $a == $b ]

只是在变量包含数字时才使用==吗?

4 个答案:

答案 0 :(得分:129)

反过来说:==用于字符串比较,-eq用于数字比较。 -eq-lt-le-gt-ge-ne位于同一系列中,如果这可以帮助您记住哪个是哪个

$ [ a == a ]; echo $?
0
$ [ a -eq a ]; echo $?
-bash: [: a: integer expression expected
2

==是一种抨击。 POSIX表单为=。如果非bash shell的可移植性很重要,请使用=

答案 1 :(得分:20)

===的特定于bash的别名,它执行字符串(词法)比较而不是数字比较。 eq当然是数字比较。

最后,我通常更喜欢使用if [ "$a" == "$b" ]

形式

答案 2 :(得分:17)

取决于运营商周围的Test Construct。您的选项是双括号,双括号,单括号或test

如果您使用((...)),则使用==测试算术资产,如C:

$ (( 1==1 )); echo $?
0
$ (( 1==2 )); echo $?
1

(注意:0表示Unix意义上的true,非零表示测试失败)

在双括号内使用-eq是语法错误。

如果您使用[...](或单支撑)或[[...]](或双支撑)或test,您可以使用-eq,-ne,-lt, - 中的一个, - le,-gt或-ge为arithmetic comparison

$ [ 1 -eq 1 ]; echo $?
0
$ [ 1 -eq 2 ]; echo $?
1
$ test 1 -eq 1; echo $?
0

单括号或双括号内的==(或test命令)是string comparison operators之一:

$ [[ "abc" == "abc" ]]; echo $?
0
$ [[ "abc" == "ABC" ]]; echo $?
1

作为字符串运算符,=相当于==,并记下所需的===周围的空格。

可以[[ 1 == 1 ]][[ $(( 1+1 )) == 2 ]]时,它正在测试字符串相等性 - 而不是算术相等性。

所以-eq生成结果可能期望1+1的整数值等于2,即使RH是一个字符串并且有一个尾随空间:

$ [[ $(( 1+1 )) -eq  "2 " ]]; echo $?
0

虽然相同的字符串比较会占用尾随空格,但字符串比较失败了:

$ [[ $(( 1+1 )) ==  "2 " ]]; echo $?
1

错误的字符串比较会产生完全错误的答案。 ' 10' 按字典顺序小于' 2',因此字符串比较会返回true0。很多人被这个错误所困扰:

$ [[ 10 < 2 ]]; echo $?
0

对10的算术小于2的正确测试:

$ [[ 10 -lt 2 ]]; echo $?
1

在评论中,有一个问题是技术原因使用整数-eq对字符串返回True对于不相同的字符串:

$ [[ "yes" -eq "no" ]]; echo $?
0

原因是Bash是untyped-eq导致字符串被解释为整数,如果可能的话包括基本转换:

$ [[ "0x10" -eq 16 ]]; echo $?
0
$ [[ "010" -eq 8 ]]; echo $?
0
$ [[ "100" -eq 100 ]]; echo $?
0

如果Bash认为它只是一个字符串,那么0

$ [[ "yes" -eq 0 ]]; echo $?
0
$ [[ "yes" -eq 1 ]]; echo $?
1

因此[[ "yes" -eq "no" ]]相当于[[ 0 -eq 0 ]]

最后注意:Test Constructs的许多Bash特定扩展都不是POSIX,因此在其他shell中会失败。其他shell通常不支持[[...]]((...))==

答案 3 :(得分:9)

伙计们:几个答案显示了危险的例子。 OP的示例[ $a == $b ]专门使用了未加引号的变量替换(截至10月&#39; 17编辑)。对于字符串相等安全的[...]

但是如果您要列举[[...]]之类的替代方案,您还必须告知必须引用右侧。如果没有引用,那就是模式匹配! (来自bash手册页:&#34;可以引用模式的任何部分以强制它匹配为字符串。&#34;)。

在bash中,两个语句产生&#34; yes&#34;是模式匹配,其他三个是字符串相等:

$ rht="A*"
$ lft="AB"
$ [ $lft = $rht ] && echo yes
$ [ $lft == $rht ] && echo yes
$ [[ $lft = $rht ]] && echo yes
yes
$ [[ $lft == $rht ]] && echo yes
yes
$ [[ $lft == "$rht" ]] && echo yes
$