Bash:双重等于与 -eq

bea*_*mit 59 shell bash arithmetic

我正在 bash 中进行整数比较(试图查看用户是否以 root 身份运行),我发现了两种不同的方法:

双等于:

if [ $UID == 0 ]
then
fi
Run Code Online (Sandbox Code Playgroud)

-eq

if [ $UID -eq 0 ]
then
fi
Run Code Online (Sandbox Code Playgroud)

我知道在 bash 中没有 >= 或 <=,只有 -ge 和 -le,那么为什么有一个==if-eq呢?

比较双方的方式有区别吗?

gee*_*aur 73

==是 的bash特定别名=,它执行字符串(词法)比较而不是-eq数字比较。(这是 Perl 的倒退:字式运算符是数字,符号运算符是词法。)

  • @tjameson 举个例子:`[ 01 -eq 1 ]` 但`[ 01 != 1 ]`。 (17认同)
  • 更准确地说,恰恰相反:一切都是字符串,`-eq` 告诉`bash` 将字符串解释为整数(如果字符串不是数字,则生成`0` 而不发出警告)。 (5认同)
  • 请注意,虽然 `==` 作为 `[` 运算符是非标准的,不应使用,但它不是 _bash 特定的_。它是由 ksh 引入的,也被 zsh(尽管第一个 `=` 需要被引用)、yash 和 GNU `[` 实用程序(以及至少在某些系统上作为 ksh 脚本实现的任何此类实用程序)支持)。 (3认同)

tox*_*lot 13

详细说明博洛万的回答......

字符串没有>=<=比较运算符。但是您可以将它们与((...))算术命令一起使用来比较整数。

如果您在内部使用它们,您还可以使用其他字符串比较运算符(==, !=, <, >, but not =)来比较整数((...))

例子

  • 双方[[ 01 -eq 1 ]](( 01 == 1 ))做整数比较。两者都是真的。
  • 双方[[ 01 == 1 ]][ 01 = 1 ]做字符串比较。两者都是假的。
  • 双方(( 01 -eq 1 ))(( 01 = 1 ))会返回一个错误。

注意:并非所有 shell 都支持[[...]]双括号语法和双括号语法((...))


bol*_*van 7

如果要进行整数比较,最好使用 (()),也可以使用 >= 等。

例子:

if (( $UID == 0 )); then
   echo "You are root"
else
   echo "You are not root"
fi
Run Code Online (Sandbox Code Playgroud)