Bash 如果文件名glob没有匹配项,如何不匹配
我想遍历所有匹配扩展名Bash 如果文件名glob没有匹配项,如何不匹配,bash,glob,shopt,Bash,Glob,Shopt,我想遍历所有匹配扩展名jpg或txt的文件。我使用: for file in myDir/*.{jpg,txt} do echo "$file" done 问题:如果目录根本不包含jpg文件,循环将有一次迭代,输出myDir/*.jpg。我认为*将被一个任意文件替换(如果没有文件存在,则无法扩展)。如何避免不必要的迭代?使用此选项可以避免不必要的迭代: shopt -s nullglob 从manbash: nullglob:如果设置,bash允许不匹配任何文件的模式(请参见上面的路径名
jpg
或txt
的文件。我使用:
for file in myDir/*.{jpg,txt}
do
echo "$file"
done
问题:如果目录根本不包含jpg文件,循环将有一次迭代,输出
myDir/*.jpg
。我认为*
将被一个任意文件替换(如果没有文件存在,则无法扩展)。如何避免不必要的迭代?使用此选项可以避免不必要的迭代:
shopt -s nullglob
从manbash
:
nullglob
:如果设置,bash允许不匹配任何文件的模式(请参见上面的路径名扩展)扩展为空字符串,而不是它们自己
请参阅:
help shopt
和shopt
这两个问题和一个重复的问题不仅涉及路径名扩展,还涉及大括号扩展和POSIX请求的重复问题
compgen-G
执行bash--posix
兼容的路径名扩展(无大括号扩展)和。。。您猜对了:如果没有匹配项,则不会产生任何结果
因此,编写一个
bash--posix
函数来实现它。简要概述:暂时使用set-f
首先通过回显进行大括号扩展(无路径名扩展),然后对路径名扩展的每个结果应用compgen-G
。完整函数留作练习。如果模式没有匹配项,默认/POSIX行为是将模式视为文本字符串,而不是忽略或删除模式。与问题无关,但请注意大括号不是模式的一部分。它们是bash
的简写,用于生成一组相关字符串,因此在模式匹配开始之前扩展到字符串myDir/*.jpg myDir/*.txt
。