2014-02-25 37 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:參數#由下式表示$#