在bash中,如果你这样做:
mkdir /tmp/empty array=(/tmp/empty/*)
你发现这个数组现在有一个元素“/ tmp / empty / *”,而不是你想要的。幸运的是,这可以通过使用shopt -s nullglob打开nullglob shell选项来避免
但是,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”中,当然,这个变量赋值与subshell一起工作。除了waiting for the Austin group导入ksh93语法,是吗?
使用Bash 4中的mapfile,您可以从subshell加载数组,例如:mapfile array< <(shopt -s nullglob; for。in ./*; do echo“$ f”; done)。完整例子:
$ shopt nullglob nullglob off $ find . ./bar baz ./qux quux $ mapfile array < <(shopt -s nullglob; for f in ./*; do echo "$f"; done) $ shopt nullglob nullglob off $ echo ${#array[@]} 2 $ echo ${array[0]} bar baz $ echo ${array[1]} qux quux $ rm * $ mapfile array < <(shopt -s nullglob; for f in ./*; do echo "$f"; done) $ echo ${#array[@]} 0
>使用echo打印文件名时,请确保使用./*替代裸*
>不适用于文件名中的换行符(由derobert指出)
如果您需要处理文件名中的换行符,则必须做的更详细:
array=() while read -r -d $'\0'; do array+=("$REPLY") done < <(shopt -s nullglob; for f in ./*; do printf "$f\0"; done)
但是到目前为止,遵循其他答案的建议可能更为简单。