for 循环解析 ls 及其背后的魔力 *

for 循环解析 ls 及其背后的魔力 *

我知道以下情况不好:

for i in `ls -1 *.MOV` ;do ...

正确的语法是

for i in  *.MOV ;do ...

但其背后的机制是什么?我的意思是,哪一部分*.MOV告诉 for 命令我正在谈论文件名?代码中是否有一个假设for“没有其他参数,假设文件名”?

而且...如果lsfor 内部的输出很糟糕,那么如何才能获得一个不会被阻塞的可用文件名列表呢?

答案1

是的:-) shell 正在将通配符扩展为与通配符表达式匹配的文件集,在您的示例中是当前目录中的 MOV 文件。但在此之前必须考虑其他六种扩张。

手册中对“扩展”进行了详细描述man bash

扩张

扩展是在命令行上被分割成单词后执行的。执行了七种扩展:大括号扩展、波形符扩展、参数和变量扩展、命令替换、算术扩展、分词和路径名扩展。

...

路径名扩展

分词后,除非设置了 -f 选项,否则 bash 会扫描每个单词中的字符 *、? 和 [。如果出现这些字符之一,则该单词被视为一种模式,并替换为按字母顺序排序的与该模式匹配的文件名列表(请参阅下面的模式匹配)。如果未找到匹配的文件名,并且未启用 shell 选项 nullglob,则该单词将保持不变。

相关内容