微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash – 有一个简单的方法为一个glob设置nullglob

在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”中,当然,这个变量赋值与subshel​​l一起工作。除了waiting for the Austin group导入ksh93语法,是吗?

使用Bash 4中的mapfile,您可以从subshel​​l加载数组,例如: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)

但是到目前为止,遵循其他答案的建议可能更为简单。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐