如果没有这样的文件,"for"循环通配符被评估为变量

xoi*_*oid 4 bash for-loop wildcard

$ for f in /etc/shell*; do echo $f; done
/etc/shells
$
Run Code Online (Sandbox Code Playgroud)

好!

$ for f in /etc/no_such*; do echo $f; done
/etc/no_such*
$
Run Code Online (Sandbox Code Playgroud)

坏!

如果没有文件,我怎样才能获得通配符评估?

Tom*_*ech 6

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

启用此选项后,没有匹配的模式将评估为空,而不是自身.

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

for f in /etc/no_such*; do [ -e "$f" ] && echo "$f"; done
Run Code Online (Sandbox Code Playgroud)

这只会在文件存在时回显.