15

我想遍历所有匹配扩展名jpgtxt. 我用:

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

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

4

2 回答 2

22

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

shopt -s nullglob

来自man bash

nullglob: 如果设置,bash 允许不匹配文件的模式(参见上面的路径名扩展)扩展为空字符串,而不是它们本身。

见:help shoptshopt

于 2015-04-03T18:56:27.263 回答
0

这个问题和一个重复的问题都不仅在路径名扩展的上下文中,而且在大括号扩展的上下文中,并且重复要求 POSIX。

兼容的路径名扩展(compgen -G没有bash --posix大括号扩展)和......你猜对了:如果没有匹配项,则不会产生任何结果。

因此编写一个bash --posix函数来完成它。简要概述:暂时用于set -f首先通过回显进行大括号扩展(没有路径名扩展),然后应用于compgen -G路径名扩展的每个结果。全部功能留作练习。

于 2019-03-17T06:07:21.223 回答