Bash

bash中的雙方括號和單方括號有什麼區別?

  • July 20, 2021

我只是想知道兩者之間到底有什麼區別

[[ $STRING != foo ]]

[ $STRING != foo ]

是,除了後者是 POSIX 兼容的,在 sh 中找到,而前者是在 bash 中找到的擴展。

有幾個不同之處。在我看來,最重要的幾個是:

  1. [是 Bash 和許多其他現代 shell 中的內置函式。內置[函式類似於test關閉的附加要求]。內置函式[test模仿功能/bin/[以及/bin/test它們的限制,以便腳本向後兼容。最初的執行檔仍然存在,主要是為了 POSIX 合規性和向後兼容性。在 Bash 中執行該命令type [表示[預設情況下將其解釋為內置命令。(注:只在PATHwhich [上查找執行檔,相當於.可以執行查看詳情)type -P [``type --help
  2. [[不兼容,它不一定適用於任何/bin/sh指向。[[更現代的 Bash / Zsh / Ksh 選項也是如此。
  3. 因為[[內置在 shell 中並且沒有遺留要求,所以您無需擔心基於IFS變數的分詞會弄亂評估為帶有空格的字元串的變數。因此,您實際上不需要將變數放在雙引號中。

在大多數情況下,其餘的只是一些更好的語法。要查看更多差異,我推薦此連結到常見問題解答:[測試、[ 和 [ 之間有什麼區別?. 事實上,如果您認真對待 bash 腳本,我建議您閱讀整個wiki,包括 FAQ、Pitfalls和 Guide。 指南部分的測試部分也解釋了這些差異,以及為什麼作者認為[[如果您不需要擔心便攜性是更好的選擇。主要原因是:

  1. 您不必擔心引用測試的左側,以便它實際上被讀取為變數。
  2. 您不必< >使用反斜杠轉義小於和大於,以免它們被評估為輸入重定向,這可能會通過覆蓋文件而真正搞砸一些東西。這又回到[[了內置。如果 [ (test) 是一個外部程序,則 shell 必須以它的評估方式進行異常處理,<並且>只有在/bin/test被呼叫時才會發生異常,這實際上沒有任何意義。

引用自:https://serverfault.com/questions/52034