Bash - 为什么循环中的这两个命令是连续运行而不是并行运行?

时间:2015-03-19 20:15:39

标签: bash loops

我正在尝试拿起一些bash,我无法弄清楚以下行为。我有一个for循环,看起来一个命令在另一个命令开始之前运行整个循环,即使它们在同一个dodone结构内。看我的例子:

这是shell脚本:

for i in "$(ls .)"
do
    printf "$i\n"
    printf "$i\n"
done

如果这是在包含文件abc的目录中运行,我希望输出为:

a
a
b
b
c
c

取而代之的是:

a
b
c
a
b
c

任何人都可以向我解释发生了什么事吗?

1 个答案:

答案 0 :(得分:5)

因为您在将表达式传递给循环之前在$(ls .)中展开表达式,所以它首先评估所有目录中的文件然后再打印两次。实质上,您的循环只包含一个您打印两次的元素。

您可以使用glob *运算符来获取所需的行为:

for i in *
do
    printf "$i\n"
    printf "$i\n"
done

这种方式*表示要迭代的列表,而不是已经评估过的字符串。