问题 如果文件名glob没有匹配,如何匹配任何内容


我想循环遍历所有匹配扩展名的文件 jpg 要么 txt。我用:

for file in myDir/*.{jpg,txt}
do
  echo "$file"
done

问题: 如果目录根本不包含jpg文件,则循环将有一次带输出的迭代 myDir/*.jpg。我想 * 将被任意文件替换(如果不存在文件,则无法扩展)。如何避免不必要的迭代?


6911
2018-04-03 18:53


起源

如果模式没有匹配项,则默认/ POSIX行为是将模式视为文字字符串,而不是忽略或删除模式。 - chepner
与问题无关,但请注意,大括号不是模式的一部分。他们是一个 bash 生成一组相关字符串的简写,并因此扩展为字符串 myDir/*.jpg myDir/*.txt 在模式匹配开始之前。 - chepner


答案:


使用它来避免不必要的迭代:

shopt -s nullglob

man bash

nullglob:如果设置,bash允许不匹配任何文件的模式(参见上面的Pathname Expansion)扩展为空字符串,而不是自己。

看到: help shopt 和 shopt


16
2018-04-03 18:56