我知道以下情况不好:
for i in `ls -1 *.MOV` ;do ...
正确的语法是
for i in *.MOV ;do ...
但其背后的机制是什么?我的意思是,哪一部分*.MOV
告诉 for 命令我正在谈论文件名?代码中是否有一个假设for
“没有其他参数,假设文件名”?
而且...如果ls
for 内部的输出很糟糕,那么如何才能获得一个不会被阻塞的可用文件名列表呢?
答案1
是的:-) shell 正在将通配符扩展为与通配符表达式匹配的文件集,在您的示例中是当前目录中的 MOV 文件。但在此之前必须考虑其他六种扩张。
手册中对“扩展”进行了详细描述man bash
。
扩张
扩展是在命令行上被分割成单词后执行的。执行了七种扩展:大括号扩展、波形符扩展、参数和变量扩展、命令替换、算术扩展、分词和路径名扩展。
...
路径名扩展
分词后,除非设置了 -f 选项,否则 bash 会扫描每个单词中的字符 *、? 和 [。如果出现这些字符之一,则该单词被视为一种模式,并替换为按字母顺序排序的与该模式匹配的文件名列表(请参阅下面的模式匹配)。如果未找到匹配的文件名,并且未启用 shell 选项 nullglob,则该单词将保持不变。