bash:按掩码列出文件并避免不匹配的掩码

bash:按掩码列出文件并避免不匹配的掩码

这是我的脚本(简化):

cd /etc; for f in *.{conf,cfg,foo}; do echo $f; done

它输出类似

adduser.conf
apg.conf
...
vdpau_wrapper.cfg
*.foo

(仅举例)

就目前而言,我使用类似

for f in *.{conf,cfg,foo}; do test -f $f && echo $f; done

因为*.foo(没有与掩码匹配的文件)

*.ext有没有更方便的解决方案(例如,如果没有找到这样的文件就不列出)?

换句话说:*.foo当没有文件与掩码匹配时,我想避免在输出中出现行*.foo

答案1

您可以使用:

shopt -s nullglob

使用以下命令再次禁用它:

shopt -u nullglob

如果您正在编写一个 shell 函数,需要暂时无条件地启用或禁用 shopt 设置,然后恢复到以前的状态,您可以执行以下操作:

oldshopt=$(shopt -p)
shopt -s nullglob
<do stuff...>
eval "$oldshopt"

还有相反的选项failglob,每当 glob 扩展失败时都会导致出现错误消息。

相关内容