Shell中的单等号、双等号和"-eq"

2024-02-06 17:48:52 浏览数 (2)

问:

在 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

0 人点赞