"for" 如果不存在此类文件,则循环通配符评估为变量

"for" loop wildcard evaluated to variable if no such files present

$ for f in /etc/shell*; do echo $f; done
/etc/shells
$

好!

$ for f in /etc/no_such*; do echo $f; done
/etc/no_such*
$

不好!

如果不存在文件,我如何获得通配符评估?

有一个特定的 shell 选项可以使用 glob 启用此行为,称为 nullglob。要启用它,请使用 shopt -s nullglob.

启用此选项后,没有匹配项的模式不会求值,而不是求值自身。

这是 bash 提供的非标准功能,因此如果您正在使用另一个 shell 或正在寻找更广泛兼容的选项,您可以向循环体添加条件:

for f in /etc/no_such*; do [ -e "$f" ] && echo "$f"; done

仅当文件存在时才会回显。