Bash,subshel​​l输出隐式引用

Tuo*_*nen 2 linux bash shell

在下面的例子中

for f in *
do
    res=$(ls -la "$f")
    echo "$res"
done
Run Code Online (Sandbox Code Playgroud)

这是使用引号的正确方法吗?我知道我应该总是引用变量,但是subshel​​l输出是否隐式引用?

Cy *_*nol 6

命令替换($())的输出未隐式引用:

$ for i in $(echo "foo bar"); do echo $i; done
foo                           
bar
Run Code Online (Sandbox Code Playgroud)

上面的循环将未引用的输出沿单词拆分。我们可以通过引用结果来防止这种行为:

$ for i in "$(echo "foo bar")"; do echo $i; done
foo bar
Run Code Online (Sandbox Code Playgroud)

但是,在分配变量时(如您的示例所示),即使没有引号,子shell的结果也不会拆分:

$ baz=$(echo "foo bar")
$ echo "$baz"
foo bar
Run Code Online (Sandbox Code Playgroud)

与StackOverflow的语法高亮显示不同,shell可以在命令替换中理解引号,因此我们无需转义嵌套的引号:

$ baz="foo"
$ echo "$(echo "$baz $(echo "bar")")"
foo bar
Run Code Online (Sandbox Code Playgroud)