Arrays 保存包含'*';重击数组
我想将egrep输出保存到bash数组:Arrays 保存包含'*';重击数组,arrays,bash,Arrays,Bash,我想将egrep输出保存到bash数组: arr=( $(egrep -Rn 'regex') ) 如果在egrep结果中碰巧有一个“*”,则看起来bash正在将“*”扩展为当前目录中的所有文件。然后将egrep的扩展加结果保存到arr中 我该如何解决这个问题?我希望grep结果中的“*”保持不变。要使用问题“正确”中尝试的惯用语,可能如下所示: # DON'T DO THIS. set -f # turn off globbing IFS=$'\n' # word
arr=( $(egrep -Rn 'regex') )
如果在egrep结果中碰巧有一个“*
”,则看起来bash正在将“*
”扩展为当前目录中的所有文件。然后将egrep的扩展加结果保存到arr中
我该如何解决这个问题?我希望grep结果中的“
*
”保持不变。要使用问题“正确”中尝试的惯用语,可能如下所示:
# DON'T DO THIS.
set -f # turn off globbing
IFS=$'\n' # word-split only on newlines
arr=( $(...) ) # populate array
unset IFS # return IFS to defaults (assuming it was there before)
set +f # turn globbing back on
显然,有很大的空间可以出错,并使shell处于与启动方式不同的状态(如果脚本具有不同的初始IFS值怎么办?如果此代码源于希望禁用globbing以正常工作的脚本怎么办?)。不要这样做
与bash 3.x兼容的一种方法是使用
read-a
(读入数组)和包含换行符的IFS
(用于分隔字段),并将-d
(用于分隔记录)设置为NUL:
IFS=$'\n' read -r -d '' -a arr < <(egrep -Rn 'regex' && printf '\0')
另一种方法是使用bash4.x特性():
readarray-tarr<不要将结果粘贴到这样的数组中。它确实存在这个(以及其他分词问题)。请参阅以了解如何正确(安全)逐行或逐字段阅读。或者,如果您真的只是想避免全局搜索,您可以使用set-f
关闭全局搜索(但这会导致分词问题等影响作业,因此不建议这样做)。好的,我将查看您的页面。但是,我需要稍后处理结果,询问用户他想要什么,然后继续。所以我认为数组会很有用?我没说不要使用数组。我说过不要像这样填充数组。请看链接页面。遗憾的是,这在BashPittals页面()上没有条目,这是一个常见的错误。嘿,这太酷了。谢谢我使用的是bash4.x。所以最后一件事很有效。你能给我解释一下“”<…还有,$(…)
也是一个子shell<代码>请参阅,或
arr=( )
while IFS= read -r; do
arr+=( "$REPLY" )
done < <(egrep -Rn 'regex')
readarray -t arr < <(egrep -Rn 'regex')