在Bash中,如果您执行以下操作:
mkdir /tmp/empty
array=(/tmp/empty/*)
你会发现array
现在有一个元素,即"/tmp/empty/*"
,而不是你想要的零个。幸运的是,可以通过使用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
让我想到一定有更好的方法。显而易见的“将其放入子shell”并不起作用,因为当然变量赋值会随着子shell而消失。除了等待Austin组导入ksh93语法之外,还有其他方法吗?
help shopt
没有提到)。我会为此点赞。但说实话,就需要记住正确的内容而言,它并不是真正简单的——在第一行中有很多要记住的东西。 - derobert