我想遍历所有匹配扩展名jpg
或txt
. 我用:
for file in myDir/*.{jpg,txt}
do
echo "$file"
done
问题:如果目录根本不包含 jpg 文件,则循环将进行一次迭代输出myDir/*.jpg
。我认为*
将被任意文件替换(如果不存在文件,则无法扩展)。如何避免不必要的迭代?
使用它来避免不需要的迭代:
shopt -s nullglob
来自man bash
:
nullglob
: 如果设置,bash 允许不匹配文件的模式(参见上面的路径名扩展)扩展为空字符串,而不是它们本身。
见:help shopt
和shopt
这个问题和一个重复的问题都不仅在路径名扩展的上下文中,而且在大括号扩展的上下文中,并且重复要求 POSIX。
兼容的路径名扩展(compgen -G
没有bash --posix
大括号扩展)和......你猜对了:如果没有匹配项,则不会产生任何结果。
因此编写一个bash --posix
函数来完成它。简要概述:暂时用于set -f
首先通过回显进行大括号扩展(没有路径名扩展),然后应用于compgen -G
路径名扩展的每个结果。全部功能留作练习。