這些有什麼區別:
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
功能;它是expr
POSIX shell 的功能中沒有包含的少數用途之一。但請注意,expr
使用相同的運算子進行字串和數字比較,因此expr 9 \< 10
but expr a9 \> a10
。
²字串是被解釋為位元組字串,還是當前語言環境中的字串,取決於 shell