Arrays 将grep输出存储在数组中

Arrays 将grep输出存储在数组中,arrays,bash,shell,Arrays,Bash,Shell,我需要在一个目录中搜索一个模式,并将包含它的文件名保存在一个数组中 搜索模式: grep -HR "pattern" . | cut -d: -f1 这将打印包含“模式”的所有文件名 如果我尝试: targets=$(grep -HR "pattern" . | cut -d: -f1) length=${#targets[@]} for ((i = 0; i != length; i++)); do echo "target $i: '${targets[i]}'" done 这只

我需要在一个目录中搜索一个模式,并将包含它的文件名保存在一个数组中

搜索模式:

grep -HR "pattern" . | cut -d: -f1
这将打印包含“模式”的所有文件名

如果我尝试:

targets=$(grep  -HR "pattern" . | cut -d: -f1)
length=${#targets[@]}
for ((i = 0; i != length; i++)); do
   echo "target $i: '${targets[i]}'"
done
这只打印一个元素,该元素包含一个包含所有名称的字符串

output: target 0: 'file0 file1 .. fileN'
但我需要:

 output: target 0: 'file0'
 output: target 1: 'file1'
 .....
 output: target N: 'fileN'
如何在不对目标执行无聊的分割操作的情况下获得结果?

您可以使用:

targets=($(grep -HRl "pattern" .))
注意在BASH中使用
(…)
创建数组


您还可以使用
grep-l
仅获取
grep
输出中的文件名(如我的命令所示)。

!我已经在看“-l”选项了,顺便说一句,很受欢迎。您能解释一下为什么添加两个括号是有效的吗?这是BASH中创建数组的语法。如果删除外部
(..)
,则只需将out of
grep
赋值给一个简单的shell变量,该变量不会被视为数组。如果文件名包含空格或通配符,则不起作用如果可能,则使用
grep--null
IFS=
来创建数组这对Posix ly OS'es有效,像一些BSD和Solaris?我不明白。