相关疑难解决方法(0)

为什么不带引号的带空格的参数扩展在双括号“[[”内起作用,而在单括号“[”内不起作用?

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

dir="/home/mazimi/VirtualBox VMs"

if [[ -d ${dir} ]]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

尽管字符串包含空格,但它工作得很好。但是当我将其更改为单括号时:

dir="/home/mazimi/VirtualBox VMs"

if [ -d ${dir} ]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

它说:

./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected
Run Code Online (Sandbox Code Playgroud)

当我将其更改为:

dir="/home/mazimi/VirtualBox VMs"

if [ -d "${dir}" ]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

它工作正常。有人可以解释发生了什么吗?什么时候应该在变量周围分配双引号,"${var}"以防止空格引起的问题?

bash ksh quoting test

106
推荐指数
3
解决办法
4万
查看次数

局部变量赋值需要引号吗?

我可以安全地省略本地作业右侧的引号吗?

function foo {
    local myvar=${bar}
    stuff()
}
Run Code Online (Sandbox Code Playgroud)

我主要对 感兴趣bash,但欢迎提供有关其他 shell 中的边角案例的任何信息。

shell-script quoting assignment

48
推荐指数
1
解决办法
9294
查看次数

将输出分配给变量时是否需要引用命令替换?

即使将其输出分配给变量,我也倾向于引用如下所示的命令替换:

var="$(command)"
Run Code Online (Sandbox Code Playgroud)

但这真的需要吗?什么时候断?此处接受的答案声称:

DIRNAME = “$(目录名称$ FILE)”不会做你想做的,如果$文件包含空格或的通配符[?*。

该链接指向 Gray Cat Wiki 关于引用的精彩页面,但该页面没有特别提及引用命令替换。虽然显然需要引用变量,但引用命令替换本身似乎并不需要。

然而,同一篇文章的结尾是:

DIRNAME="$(dirname "$FILE")" 是推荐的方式。您可以用命令和空格替换 DIRNAME= 而不更改任何其他内容,并且 dirname 接收正确的字符串。

这也是我一直以来的想法,并且经常在这里修改没有引用它的帖子。但是,链接到上面的维基页面也声称:

有几种情况可以安全地省略双引号:

在简单作业的右侧。你可以写 foo=$bar 不带引号。这是符合 POSIX 的。

[. . . ]

虽然var=$(command)不是真正的“简单”任务,但我仍然无法找到实际需要引号的情况:

$ var=$(echo "foo bar baz")  ## whitespace works
$  echo "$var"
foo bar baz

$ var=$(printf "foo\nbar * baz") ## so do globbing characters
$ echo "$var"
foo
bar * baz

$ var1="foo\nbar * baz"
$ var=$(printf "$var1")  ## printing …
Run Code Online (Sandbox Code Playgroud)

shell quoting command-substitution

6
推荐指数
2
解决办法
246
查看次数