有人可以在bash脚本中解释-eq
和==
之间的区别吗?
以下是否有任何区别?
[ $a -eq $b ]
和[ $a == $b ]
只是在变量包含数字时才使用==
吗?
答案 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',因此字符串比较会返回true
或0
。很多人被这个错误所困扰:
$ [[ 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
$