在 Bash 中,该命令的语法for
为:
for name [ [in [words ...] ] ; ] do commands; done
但这个例子有效
for f in ls *; do echo $f; done
我认为这
ls *
是一个命令,不能用作words
.相反,我们应该使用for f in *; do echo $f; done
, 其中*
文件名扩展可以用作单词。那么为什么上面的例子有效呢?我认为为了
ls *
用作words
,我们必须使用命令替换:for f in $(ls *); do echo $f; done
但这个例子并没有做与前一个例子完全相同的事情。这个会列出子目录的内容,而前一个只列出子目录,不列出子目录的内容。为什么两个示例之间存在这种差异?
答案1
ls
只是一个单词,*
并被 shell 扩展。
在第二个示例中,shell 首先展开,*
然后ls
调用它来列出结果。