Bash

為什麼使用不帶引號的空格的參數擴展在雙括號“[[”內有效,但在單括號“[”內無效?

  • October 22, 2020

我對使用單括號或雙括號感到困惑。看看這段程式碼:

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

引用自:https://unix.stackexchange.com/questions/32210