为什么在这个bash循环示例

时间:2017-01-13 21:15:04

标签: bash

为什么在这两种情况下字段的解析方式不同:

  1. for u in $( echo "a b c"); do echo $u; done
    a
    b
    c
    
  2. for u in "a b c"; do echo $u; done
    a b c
    
  3. 在第二种情况下,我已经习惯了。我可以更改IFS以通过空格来解析字段。但在第一种情况下,为什么它可以通过空格进行解析?

3 个答案:

答案 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

在任何一种情况下,它都是防止外部单词拆分的外部引号。 是否在内部进行分词与此无关。