“>”和“-gt”之間的區別

“>”和“-gt”之間的區別

這些有什麼區別:

SEC=$(mysql -hxxx -Pxxx -uxxx -pxxx -se "SELECT Seconds FROM tablename")

SEC=100

兩者都回傳相同的結果 (100)。但是當我測試它時:

if [ ${SEC} > 1 ]
then
    echo "SEC GT 1"
else
    echo "SEC LT 1"
fi

第一個回傳:

"SEC GT 1"

第二個回傳:

"SEC LT 1"

但是,如果我將其更改為:

if [ ${SEC} -gt 1 ]

那麼結果就相反了。

我假設它與資料類型有關,並且我大概需要cast其中之一才能獲得相同的結果。

只是目前它擾亂了我的測試,因為我必須記住IF每次都更改該部分。

答案1

最初,[是作為普通命令實現的,與其他命令相同,test只是[需要在末尾有一個額外的參數,該參數必須是]。 (它仍然作為普通命令存在,但大多數 shell 也有內建命令。)鑑於它是一個受普通解析影響的普通命令,它不能使用數學運算符<並且>不加引號:[ ${SEC} > 1 ]包含重定向運算符,它是等效的to [ ${SEC} ] >1,將指令的(空)輸出重新導向[到名為1.此[指令主要遵循以破折號開頭的特殊選項的通常約定:其大多數運算子都以破折號開頭。因此,需要[ -r foo ]測試一個檔案是否可讀,[ -r foo -a -w bar ]用「and」運算子將兩個測試結合起來,[ $x -eq $y ]測試$x和是否$y相等等等。

這些較舊的 shell 具有字串相等性(=運算符,是少數幾個偏離破折號字母約定的運算符之一),但沒有字串排序。不過,他們進行了數值比較,例如[ $x -le $y ]測試整數是否$x小於或等於$y,而這組運算子包括數值相等[ $x -eq $y ][ 010 -eq 8 ]因為前導零意味著該數字是八進制的。

Ksh 引入了語法[[ … ]],現在也可在 bash 和 zsh 中使用。與 不同的是[ … ],它是一個普通命令,[[ … ]]可以被 shell 的解析器識別,因此可以在內部使用特殊字元(例如和(<而無需引號(實際上它們不能被引號括起來)。因為-lt和朋友已經可以進行數值比較,並且=已經在進行字串比較,<並且朋友被製作為字串比較運算子(字典順序1)。因此,例如,[ 9 -lt 10 ]但是[[ 10 < 9 ]]

1該實用程式提供字串排序expr功能;它是exprPOSIX shell 的功能中沒有包含的少數用途之一。但請注意,expr使用相同的運算子進行字串和數字比較,因此expr 9 \< 10but expr a9 \> a10
²字串是被解釋為位元組字串,還是當前語言環境中的字串,取決於 shell

相關內容