我正在尝试拿起一些bash,我无法弄清楚以下行为。我有一个for循环,看起来一个命令在另一个命令开始之前运行整个循环,即使它们在同一个do
和done
结构内。看我的例子:
这是shell脚本:
for i in "$(ls .)"
do
printf "$i\n"
printf "$i\n"
done
如果这是在包含文件a
,b
,c
的目录中运行,我希望输出为:
a
a
b
b
c
c
取而代之的是:
a
b
c
a
b
c
任何人都可以向我解释发生了什么事吗?
答案 0 :(得分:5)
因为您在将表达式传递给循环之前在$(ls .)
中展开表达式,所以它首先评估所有目录中的文件然后再打印两次。实质上,您的循环只包含一个您打印两次的元素。
您可以使用glob *
运算符来获取所需的行为:
for i in *
do
printf "$i\n"
printf "$i\n"
done
这种方式*
表示要迭代的列表,而不是已经评估过的字符串。