我想循环遍历所有与扩展程序jpg
或txt
匹配的文件。我用:
for file in myDir/*.{jpg,txt}
do
echo "$file"
done
问题:如果目录根本不包含jpg文件,则循环将进行一次输出myDir/*.jpg
的迭代。我以为*
将被任意文件替换(如果不存在文件,则无法展开)。如何避免不必要的迭代?
答案 0 :(得分:17)
使用它来避免不必要的迭代:
shopt -s nullglob
来自man bash
:
nullglob
:如果设置,bash允许不匹配任何文件的模式(请参阅上面的Pathname Expansion)扩展为空字符串,而不是自己。
请参阅:help shopt
和shopt
答案 1 :(得分:0)
这个问题和重复的问题不仅与路径名扩展有关,还与括号扩展有关,并且重复项要求提供POSIX。
compgen -G
进行bash --posix
兼容的路径名扩展(不带花括号扩展),并且...您猜对了:如果没有匹配项,则不会产生任何结果。
因此,编写一个bash --posix
函数即可。简要概述:临时使用set -f
首先通过回显进行大括号扩展(不进行路径名扩展),然后将compgen -G
应用于每个结果以进行路径名扩展。保留所有功能作为练习。