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