shell的二进制运算符兼容性

时间:2014-02-25 22:30:08

标签: bash shell string-comparison comparison-operators

我不禁注意到有很多shell代码使用比较运算符作为test命令的参数,而不是符号。

例如,要使用test测试是否在shell中没有收到任何参数:

if test $# -eq 0
then
    echo "No arguments received"
fi

为什么我们不能用-eq用更多传统,直观,熟悉,通用和可读的符号替换==?所以我们有以下内容:

if test $# == 0
then
    echo "No arguments received"
fi

其他比较运算符< < = => >

我假设这背后有一些技术原因(可能是兼容性问题?)支持-eq格式优于==,但我不了解它们。

2 个答案:

答案 0 :(得分:3)

您可以在BASH中使用支持(( and ))==>=,{{等所有运算符的<=算术处理器) 1}},<等:

>

PS:参数数量由if (( $# == 0 )) then echo "No arguments received" fi

表示

答案 1 :(得分:3)

首先,使用$#,而不是$@

差异的技术原因是运算符定义了操作数的解释方式。

对于<=>,操作数被视为字符串。这意味着10 < 2因为1-something出现在字母表中的2-something之前,而1 != 01因为字符串具有不同的长度。

对于-eq-gt-lt,操作数被视为整数。这意味着2 -lt 10因为数字2小于数字10和1 -eq 01,因为这些都是数字上相同的写作方式1