问:
在 shell 脚本编程中,=,== 和 -eq 之间的区别是什么?
以下内容是否有任何区别?
代码语言:javascript复制[ $a = $b ]
[ $a == $b ]
[ $a -eq $b ]
是不是 = 和 == 只在变量包含数字时使用?
答:
= 和 == 用于字符串比较 -eq 用于数值比较
注意 == 不是 POSIX 兼容的,在 sh(Bourne Shell) 或其兼容的 POSIX shell 中,== 用于字符串比较的操作符不是正式支持的。POSIX 规范和原始的 Bourne Shell 使用单个等号 = 作为字符串比较的操作符。在 Bourne Again Shell(bash) 、ksh 中,则两者都可以使用。
代码语言:javascript复制$ a=foo
$ [ "$a" = foo ]; echo "$?" # POSIX sh
0
$ [ "$a" == foo ]; echo "$?" # bash-style
0
$ [ "$a" -eq foo ]; echo "$?" # wrong
-bash: [: foo: integer expression expected
2
(注:确保引用变量表达式。不要省略上述代码中的双引号。)
经测试可知:
expression shell | bash | ksh | zsh |
---|---|---|---|
[ "$a" = foo ] | yes | yes | yes |
[ "$a" == foo ] | yes | yes | no |
[[ "$a" = foo ]] | yes | yes | yes |
[[ "$a" == foo ]] | yes | yes | yes |
当你写脚本打算在不同的 shell 环境下运行时,了解这些细微的差别和兼容性问题是很重要的。如果你想编写兼容 POSIX 的脚本,在比较字符串时最好使用单等号 = 或者用双方括号的表达式。
-eq 是条件测试的一部分,用于在 [ ] 或 [[ ]] 结构中判断两个整数是否相等。
代码语言:javascript复制#!/bin/bash
num1=10
num2=20
num3=10
if [ $num1 -eq $num2 ]; then
echo "num1 equals num2"
else
echo "num1 does not equal num2"
fi
if [[ $num1 -eq $num3 ]]; then
echo "num1 equals num3"
else
echo "num1 does not equal num3"
fi
其他比较整数的操作符有:
- -ne: not equal to, 不等于。
- -lt: less than, 小于。
- -le: less than or equal to, 小于或等于。
- -gt: greater than, 大于。
- -ge: greater than or equal to, 大于或等于。
参考文档:
- stackoverflow question 20449543
- https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions