如果我想检查是否存在单个文件,我可以使用test -e filename或测试它[ -e filename ].
假设我有一个glob,我想知道是否存在名称与glob匹配的文件.glob可以匹配0个文件(在这种情况下我不需要做任何事情),或者它可以匹配1个或多个文件(在这种情况下我需要做一些事情).如何测试glob是否有匹配?(我不关心有多少匹配,如果我能用一个if语句而没有循环(仅仅因为我发现最可读)这样做是最好的.
(test -e glob*如果glob匹配多个文件,则失败.)
在bash中,如果你这样做:
mkdir /tmp/empty
array=(/tmp/empty/*)
Run Code Online (Sandbox Code Playgroud)
你发现array现在有一个元素"/tmp/empty/*",而不是你想要的零.值得庆幸的是,可以使用打开nullglob shell选项来避免这种情况shopt -s nullglob
但是nullglob是全局的,当编辑现有的shell脚本时,可能会破坏一些东西(例如,是否有人检查退出代码ls foo*以检查是否存在以"foo"开头的文件?).因此,理想情况下,我只想在小范围内启用它 - 理想情况下,一个文件名扩展.您可以使用它再次关闭shopt -u nullglob但当然只有在之前禁用它时:
old_nullglob=$(shopt -p | grep 'nullglob$')
shopt -s nullglob
array=(/tmp/empty/*)
eval "$old_nullglob"
unset -v old_nullglob
Run Code Online (Sandbox Code Playgroud)
让我觉得必须有一个更好的方法.明显的"把它放在子shell中"不起作用,因为变量赋值与子shell一起消失.除了等待Austin组导入ksh93语法之外,还有吗?