为什么在这两种情况下字段的解析方式不同:
for u in $( echo "a b c"); do echo $u; done
a
b
c
for u in "a b c"; do echo $u; done
a b c
在第二种情况下,我已经习惯了。我可以更改IFS以通过空格来解析字段。但在第一种情况下,为什么它可以通过空格进行解析?
答案 0 :(得分:4)
不带引号的命令替换会进行分词,就像使用
一样fake_list=$(echo "a b c")
for u in $fake_list; do echo $u; done
答案 1 :(得分:1)
围绕double quotes
的额外$(echo "a b c")
会阻止分词:
for u in "$(echo "a b c")"; do echo $u; done
输出
a b c
答案 2 :(得分:-1)
每当涉及命令替换时,单词拆分可能会发生两次,一次在命令替换内,一次在外部。引号将阻止单词拆分,但您需要引用命令替换以防止在这种情况下拆分结果。
三个例子:
set -- "a b c"
echo $#
1
在这种情况下,引号会阻止分词。
set -- $(echo "a b c")
echo $#
3
在第二种情况下,$(...)
被a b c
取代
但现在,这已不再引用了,所以再次受到影响
分词。
如果我们将引号移到命令替换之外,结果
将echo
再次解释为单个条目:
set -- "$(echo a b c)"
echo $#
1
这也可以写成
set -- "$(echo "a b c")"
echo $#
1
在任何一种情况下,它都是防止外部单词拆分的外部引号。 是否在内部进行分词与此无关。