Bash Shell测试等量关系

Bash Shell测试等量关系,你想要检查两个 shell 变量是否相等,但是存在两种测试运算符:-eq 和 =(或 ==)。该用哪个呢?

解决方案

你需要的比较类型决定了该用哪种运算符。如果是进行数值比较,可以使用 -eq 运算符;如果是进行字符串比较,则使用 =(或 ==)运算符。

讨论

下例是一个演示了这两种情况的简单脚本。

#!/usr/bin/env bash
# 实例文件:strvsnum
#
# 老生常谈的字符串与数值比较
#
VAR1=" 05 "
VAR2="5"
printf "%s" "do they -eq as equal? "
if [ "$VAR1" -eq "$VAR2" ]
then
    echo YES
else
    echo NO
fi

printf "%s" "do they = as equal? "
if [ "$VAR1" = "$VAR2" ]
then
    echo YES
else
    echo NO
fi

如果运行该脚本,我们会得到:

$ bash strvsnum
do they -eq as equal? YES
do they = as equal? NO
$

尽管两个变量的数值相等(5),但从字符角度来看,前导字符 0 和空白字符意味着这两个字符串并不相同。

= 和 == 都可以使用,但 = 符合 POSIX 标准,可移植性更好。

如果认识到 -eq 运算符类似于 FORTRAN 中的 .eq. 运算符,也许有助于你记忆采用哪种比较。(FORTRAN 是一种用于科学计算的语言,非常倚重数值处理。)实际上,bash 还有其他一些数值比较运算符,都类似于古老的 FORTRAN 运算符。

下表已经将其全部列出,这些缩写非常好记,很容易就能猜出含义。

Bash Shell测试等量关系

另一种记忆方法是“逆反法”:将看似字符串一样的比较运算符(采用的是字符写法,如 -eq)用于数值比较,将看似比较数值的运算符(如数学中用到的 +<=+)用于字符串比较。

这和 Perl 正好相反,在后者中,eq、ne 等属于字符串比较运算符,而 ==、!= 等属于数值比较运算符。

可能最好的办法就是始终在 (()) 语法中进行数值测试,在 [[ ]] 语法中进行字符串比较。这样你就可以在比较时一直使用数学形式的符号了。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!