有人可以解释bash脚本之间-eq和之间的区别==吗?
以下是否有任何区别?
[ $a -eq $b ]
和 [ $a == $b ]
只是==当变量包含数字时才使用它吗?
Joh*_*ica 144
反之亦然:==用于字符串比较,-eq用于数字比较.-eq在同一家庭-lt,-le,-gt,-ge,和-ne,如果这能帮助你记住哪个是哪个.
$ [ a == a ]; echo $?
0
$ [ a -eq a ]; echo $?
-bash: [: a: integer expression expected
2
Run Code Online (Sandbox Code Playgroud)
==是一种打击主义.POSIX表单是=.如果非bash shell的可移植性很重要,请使用=.
Ell*_*sch 23
==是一个特定于bash的别名=,它执行字符串(词法)比较而不是数字比较.eq当然是数字比较.
最后,我通常更喜欢使用表格 if [ "$a" == "$b" ]
daw*_*awg 21
它取决于运营商周围的测试结构.您的选项是双括号,双括号,单括号或测试
如果你使用((...)),你正在测试算术权益,==如在C中:
$ (( 1==1 )); echo $?
0
$ (( 1==2 )); echo $?
1
Run Code Online (Sandbox Code Playgroud)
(注:0指true在Unix意识和非零是一个失败的试验)
使用-eq双括号里面是一个语法错误.
如果您使用[或]单支撑或[[...]](或双支撑),或者test您可以使用-eq,-ne,-lt,-le,-gt或-ge作为算术比较.
$ [ 1 -eq 1 ]; echo $?
0
$ [ 1 -eq 2 ]; echo $?
1
$ test 1 -eq 1; echo $?
0
Run Code Online (Sandbox Code Playgroud)
的==单或双括号(或内部test命令)是一个字符串比较操作符:
$ [[ "abc" == "abc" ]]; echo $?
0
$ [[ "abc" == "ABC" ]]; echo $?
1
Run Code Online (Sandbox Code Playgroud)
作为字符串运算符,=相当于==并注意周围的空白=或其==所需的空格.
虽然你可以做[[ 1 == 1 ]]或[[ $(( 1+1 )) == 2 ]]正在测试字符串相等 - 而不是算术相等.
所以-eq产生的结果可能是整数值1+1等于2即使RH是一个字符串并且有一个尾随空格:
$ [[ $(( 1+1 )) -eq "2 " ]]; echo $?
0
Run Code Online (Sandbox Code Playgroud)
虽然相同的字符串比较会占用尾随空格,但字符串比较失败:
$ [[ $(( 1+1 )) == "2 " ]]; echo $?
1
Run Code Online (Sandbox Code Playgroud)
错误的字符串比较可以产生完全错误的答案.'10'按字典顺序小于'2',因此字符串比较返回true或0.很多人都被这个错误所困扰:
$ [[ 10 < 2 ]]; echo $?
0
Run Code Online (Sandbox Code Playgroud)
与算术上小于2的10的正确测试:
$ [[ 10 -lt 2 ]]; echo $?
1
Run Code Online (Sandbox Code Playgroud)
在评论中,有一个问题是技术原因使用-eq字符串上的整数返回True对于不相同的字符串:
$ [[ "yes" -eq "no" ]]; echo $?
0
Run Code Online (Sandbox Code Playgroud)
原因是Bash是无类型的.如果可能,-eq导致字符串被解释为整数,包括基本转换:
$ [[ "0x10" -eq 16 ]]; echo $?
0
$ [[ "010" -eq 8 ]]; echo $?
0
$ [[ "100" -eq 100 ]]; echo $?
0
Run Code Online (Sandbox Code Playgroud)
而0如果猛砸认为它只是一个字符串:
$ [[ "yes" -eq 0 ]]; echo $?
0
$ [[ "yes" -eq 1 ]]; echo $?
1
Run Code Online (Sandbox Code Playgroud)
所以[[ "yes" -eq "no" ]]相当于[[ 0 -eq 0 ]]
最后注意:Test Constructs的许多Bash特定扩展都不是POSIX,因此在其他shell中会失败.其他炮弹一般不支持[[...]]和((...))或==.
bk-*_*-se 14
伙计们:几个答案显示了危险的例子.OP的例子[ $a == $b ]特别使用了非引号变量替换(截至2017年10月编辑).因为[...]这对于字符串相等是安全的.
但是,如果您要列举类似的替代方案[[...]],您还必须告知必须引用右侧.如果没有引用,那就是模式匹配!(来自bash手册页:"可以引用模式的任何部分以强制它匹配为字符串.").
在bash中,产生"yes"的两个语句是模式匹配,其他三个是字符串相等:
$ 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
$
Run Code Online (Sandbox Code Playgroud)