加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 19:16:12 所属栏目:安全 来源:网络整理
导读:在bash中,如果你这样做: mkdir /tmp/emptyarray=(/tmp/empty/*) 你发现这个数组现在有一个元素“/ tmp / empty / *”,而不是你想要的。幸运的是,这可以通过使用shopt -s nullglob打开nullglob shell选项来避免 但是,nullglob是全局的,当编辑现有的shel
在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 $''; do
    array+=("$REPLY")
done < <(shopt -s nullglob; for f in ./*; do printf "$f"; done)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读