Bash
為什麼使用不帶引號的空格的參數擴展在雙括號“[[”內有效,但在單括號“[”內無效?
我對使用單括號或雙括號感到困惑。看看這段程式碼:
dir="/home/mazimi/VirtualBox VMs" if [[ -d ${dir} ]]; then echo "yep" fi
儘管字元串包含空格,但它工作得很好。但是當我將其更改為單括號時:
dir="/home/mazimi/VirtualBox VMs" if [ -d ${dir} ]; then echo "yep" fi
它說:
./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected
當我將其更改為:
dir="/home/mazimi/VirtualBox VMs" if [ -d "${dir}" ]; then echo "yep" fi
它工作正常。有人可以解釋發生了什麼嗎?我什麼時候應該在變數周圍加上雙引號,
"${var}"
以防止由空格引起的問題?
單括號
[
實際上是test
命令的別名,它不是語法。單括號的(許多)缺點之一是,如果它試圖評估的一個或多個操作數返回一個空字元串,它將抱怨它期待兩個操作數(二進制)。這就是你看到人們這樣做
[ x$foo = x$blah ]
的原因,x
保證操作數永遠不會評估為空字元串。
[[ ]]
另一方面,雙括號是語法,比[ ]
. 正如您所發現的,它沒有“缺少操作數”的問題,並且它還允許使用>, <, >=, <=, !=, ==, &&, ||
運算符進行更多類似 C 的語法。我的建議如下:如果您的口譯員是
#!/bin/bash
,那麼請始終使用[[ ]]
重要的是要注意並非所有 POSIX shell 都支持它,但是許多 shell 確實支持它,
[[ ]]
例如zsh``ksh``bash