bash 中的 if 和 [[ 有什麼不同?

bash 中的 if 和 [[ 有什麼不同?

我看到

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 exprif [ expr ]是可移植的(即所有 shell 都可以處理它們,並且處理它們幾乎相同)並且if [[ expr ]]if (( expr ))是特定於實現的,即它們是關鍵字,其評估很大程度上取決於您在其中使用它們的shell(如果您是不使用諸如bashzsh、 或 之類的東西ksh,它們甚至可能不存在)。

相關內容