在 bash 中,如果你这样做:
mkdir /tmp/empty
array=(/tmp/empty/*)
你会发现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
让我觉得一定有更好的方法。显而易见的“把它放在一个子shell中”是行不通的,因为变量赋值当然会随着子shell而死。除了等待奥斯汀组导入 ksh93 语法,还有吗?