Arrays 保存包含'*';重击数组

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

我想将egrep输出保存到bash数组:

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')