为什么带有引号的空格的参数扩展在双括号“[[”内部工作但不在单括号内“[”?

Modified on: Sat, 30 Jun 2018 10:54:00 +0800

我对使用单支架或双支架感到困惑。看看这段代码:

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保证操作数永远不会计算为空字符串。

双括号[[ ]],另一方面,是语法,比[ ]更有能力。正如您所发现的那样,它没有单个操作数问题,并且它还允许使用>, <, >=, <=, !=, ==, &&, ||运算符。

我的建议如下:如果你的翻译是#!/bin/bash,那么总是使用[[ ]]

重要的是要注意所有POSIX shell都不支持[[ ]],但是很多shell都支持它,例如zshksh

作者:SiegeX

相关问答

添加新评论