2014-02-25 36 views
0

我不禁注意到使用比较运算符如test命令的参数有很多shell代码,而不是符号。shell的二进制运算符兼容性

例如,使用test测试如果外壳没有收到参数:

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

我们为什么不能有更多,比如说,传统的,直观的,熟悉的,普遍的,并且,可读标志更换-eq==?所以,我们有以下几点:

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

这同样与其他运营商相比< < = =>>。

我假设这背后必然存在一些技术原因(可能是兼容性问题?)赞成-eq格式而不是==,但我不知道它们。

回答

3

首先,使用$#而不是[email protected]

区别的技术原因是操作员定义了操作数的解释方式。

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

对于-eq,-gt,-lt,操作数被认为是整数。这意味着​​因为数字2小于数字10和1 -eq 01,因为这两个数字都是1的等效写法。

+0

这正是我一直在寻找的!使用字符串比较运算符进行整数比较还有什么副作用? – melvynkim

+1

它主要是这个 - 按字母顺序排列的数字顺序,以及整数规范化。这在8月份尤其重要,因为前导零表示八进制表示法,'date +%m'开始返回无效数字'08'。 –

3

可以在BASH使用((and))算术处理器)支持像==>=<=<>等所有的操作符:

​​

PS:参数#由下式表示$#