Bash
bash中的雙方括號和單方括號有什麼區別?
我只是想知道兩者之間到底有什麼區別
[[ $STRING != foo ]]
和
[ $STRING != foo ]
是,除了後者是 POSIX 兼容的,在 sh 中找到,而前者是在 bash 中找到的擴展。
有幾個不同之處。在我看來,最重要的幾個是:
[
是 Bash 和許多其他現代 shell 中的內置函式。內置[
函式類似於test
關閉的附加要求]
。內置函式[
和test
模仿功能/bin/[
以及/bin/test
它們的限制,以便腳本向後兼容。最初的執行檔仍然存在,主要是為了 POSIX 合規性和向後兼容性。在 Bash 中執行該命令type [
表示[
預設情況下將其解釋為內置命令。(注:只在PATHwhich [
上查找執行檔,相當於.可以執行查看詳情)type -P [``type --help
[[
不兼容,它不一定適用於任何/bin/sh
指向。[[
更現代的 Bash / Zsh / Ksh 選項也是如此。- 因為
[[
內置在 shell 中並且沒有遺留要求,所以您無需擔心基於IFS變數的分詞會弄亂評估為帶有空格的字元串的變數。因此,您實際上不需要將變數放在雙引號中。在大多數情況下,其餘的只是一些更好的語法。要查看更多差異,我推薦此連結到常見問題解答:[測試、[ 和 [ 之間有什麼區別?. 事實上,如果您認真對待 bash 腳本,我建議您閱讀整個wiki,包括 FAQ、Pitfalls和 Guide。 指南部分的測試部分也解釋了這些差異,以及為什麼作者認為
[[
如果您不需要擔心便攜性是更好的選擇。主要原因是:
- 您不必擔心引用測試的左側,以便它實際上被讀取為變數。
- 您不必
< >
使用反斜杠轉義小於和大於,以免它們被評估為輸入重定向,這可能會通過覆蓋文件而真正搞砸一些東西。這又回到[[
了內置。如果 [ (test) 是一個外部程序,則 shell 必須以它的評估方式進行異常處理,<
並且>
只有在/bin/test
被呼叫時才會發生異常,這實際上沒有任何意義。