
我看到
if cmd
then
echo Hi
fi
工作方式不同於
if [[ $(cmd) ]]
then
echo Hi
fi
那麼當有 [[ 和沒有 [[ 時會發生什麼事?
答案1
在 shell 中[
是 test 指令的別名。它是命令。這[[
是某些 shell 的一個功能,只是略有不同。在 bash 中它是一個關鍵字,而不是一個命令,但功能類似於命令。
您可以這樣想:您正在運行[[
並提供“$(cmd)”的輸出作為該命令的參數。if
然後檢查 的返回狀態[[
。當沒有給 任何運算符時[[
,-n
則暗示 , 。
-n string
True if the length of string is non-zero.
舉個例子:
if cmd # check the return status of cmd
if [[ $(cmd) ]] # check if cmd has any output
答案2
語句(不帶括號)在被評估為 bash 指令後if expr
檢查返回狀態。expr
成功後,它被視為一種true
價值。
另一方面,if [[ expr ]]
帶有雙方括號的是bash
特定的關鍵字它可以處理自己的一組選項,例如-f /path/to/file
測試檔案是否存在,甚至處理變數測試,例如$a == $b
.在這些括號內,您必須明確告訴它將某些表達式計算為一組 bash 指令if [[ $(cmds) ]]
。否則,它將把那裡的任何內容視為特殊表達式,並以不同的方式進行解析。
還有一個if [ expr ]
構造,它通常是一個別名(或者,在某些情況下,是一個近似的實現)if test expr
。如果該test
命令有可用的選項,那麼您也可以在單括號之間使用它。
為了更有趣,有一個if ((expr))
構造,它在處理數字時最好,因為裡面的所有內容都被評估為算術表達式。這也是一個關鍵字,就像雙括號一樣。
基本上,if expr
和if [ expr ]
是可移植的(即所有 shell 都可以處理它們,並且處理它們幾乎相同)並且if [[ expr ]]
和if (( expr ))
是特定於實現的,即它們是關鍵字,其評估很大程度上取決於您在其中使用它們的shell(如果您是不使用諸如bash
、zsh
、 或 之類的東西ksh
,它們甚至可能不存在)。