Arrays 对数组中的每个对象执行多个函数,并将结果重定向到文件

Arrays 对数组中的每个对象执行多个函数,并将结果重定向到文件,arrays,linux,function,shell,loops,Arrays,Linux,Function,Shell,Loops,如何对数组中的每个对象执行多个函数并将结果输出到文件? 这是我的数组,它是一个命令的值,该命令列出当前目录中的所有文本文件: #/垃圾箱/垃圾箱 声明-a文件 FILES=($(find.-mindepth 1-maxdepth 1-type f-iname“*.txt”)) 正如您在下面看到的,它是有效的: #打印完整数组: 回显“${FILES[@]}” ./1.txt./2.txt./3.txt #打印阵列中的对象数: 回显“${#文件[@]}” 3. #循环遍历数组中的每个对象并打印其

如何对数组中的每个对象执行多个函数并将结果输出到文件?

这是我的数组,它是一个命令的值,该命令列出当前目录中的所有文本文件:

#/垃圾箱/垃圾箱
声明-a文件
FILES=($(find.-mindepth 1-maxdepth 1-type f-iname“*.txt”))
正如您在下面看到的,它是有效的:

#打印完整数组:
回显“${FILES[@]}”
./1.txt./2.txt./3.txt
#打印阵列中的对象数:
回显“${#文件[@]}”
3.
#循环遍历数组中的每个对象并打印其名称:
对于“${FILES[@]}”中的文件
做
回显“$file”
完成
./1.txt
./2.txt
/3.txt
对于阵列中的每个对象,我需要执行三个功能:

#使用grep返回整行:
GREP=“$(cat“$file”| GREP'字符串_A')”
#使用awk仅返回行的一部分(第二列,第一个冒号之后)
AWK=“$(cat“$file”| AWK-F:'/String_B/{print$2;exit}')”
#使用sed返回从C到E(C+D+E)的所有行
SED=“$(cat“$file”| SED-nE'/String_C/,/String_E/p')”
为此,一个“For循环”:

“${FILES[@]}中文件的
”
做
echo“$GREP:$AWK:$SED”
完成
文件\u 1\u Grep\u字符串\u A:文件\u 1\u Awk\u字符串\u B:文件\u 1\u使用的字符串\u C
文件\u 1使用的\u字符串\u D
文件1已使用字符串
文件\u 3\u Grep\u字符串\u A:文件\u 3\u Awk\u字符串\u B:文件\u 3\u使用的字符串\u C
文件\u 3使用的\u字符串\u D
文件3使用的字符串
文件\u 2\u Grep\u字符串\u A:文件\u 2\u Awk\u字符串\u B:文件\u 2\u使用的字符串\u C
文件2已使用字符串D
文件2使用的字符串
这是我所需要的全部信息,但我需要将这些信息写入名为
results
的文件中, 问题是,当我将此输出重定向到文件时,只解析数组中的第一个对象:

“${FILES[@]}中文件的
”
做
echo“$GREP:$AWK:$SED”>一些文件
完成
猫的一些文件
文件\u 2\u Grep\u字符串\u A:文件\u 2\u Awk\u字符串\u B:文件\u 2\u使用的字符串\u C
文件2已使用字符串D
文件2使用的字符串
总结: 该命令在输出到标准输出时正常工作,但在重定向到文件时不能正常工作

我在stackoverflow(在数组上执行函数)上发现了类似的问题,但没有一个将输出重定向到文件

我觉得这很奇怪,我从来没有一个命令输出到stdout fine,但无法在其他地方的文本中得到它

虽然我是新来的,但我的最后两个问题并没有被一些成员很好地接受,因为我太简短了, 因此,我认为这次我已经一步一步地完整地解释和展示了输出

另外,为了减轻制作相同测试环境和复制/粘贴所有这些内容的负担, 我把它放在github上供你克隆,希望这能有所帮助

同样,为了让事情变得简单,在这里你会发现两个脚本, 主要的一个问题,称为
script.sh
(这是一个需要修复的问题,它是干净的/未注释的) 但我也包括了一个名为
tests.sh
,这基本上是我所采取的所有步骤, 它包含了大量的评论,这些评论将进一步帮助您更好地理解我在这里所能解释的

老实说,我肯定会先看一看, 执行起来也很安全(它包含了我上面显示的所有工作位,比如打印数组), 这样可以节省您键入命令来测试阵列等

提前谢谢你!我希望这次我做得更好

git克隆https://github.com/5c0tt-b0t/stackoverflow_test

测试脚本输出:

测试:测试
完整阵列:
./1.txt./3.txt./2.txt
计数:
3.
物体:
./1.txt
物体:
/3.txt
物体:
./2.txt
##########我需要的信息:##########
文件\u 1\u Grep\u字符串\u A:文件\u 1\u Awk\u字符串\u B:文件\u 1\u使用的字符串\u C
文件\u 1使用的\u字符串\u D
文件1已使用字符串
文件\u 3\u Grep\u字符串\u A:文件\u 3\u Awk\u字符串\u B:文件\u 3\u使用的字符串\u C
文件\u 3使用的\u字符串\u D
文件3使用的字符串
文件\u 2\u Grep\u字符串\u A:文件\u 2\u Awk\u字符串\u B:文件\u 2\u使用的字符串\u C
文件2已使用字符串D
文件2使用的字符串

您可以重定向整个循环的输出:

“${FILES[@]}中文件的
”
做
echo“$GREP:$AWK:$SED”
完成>一些文件

另外,请使用
#/bin/bash
当使用类似于bash的数组时,
/bin/sh
不一定支持数组。

谢谢!很好用!我想我刚刚发现了一个shell的“怪癖”,看着它,我的努力似乎仍然应该像我预期的那样工作,而不是更改命令,因为我正在重定向到一个文件而不是标准输出。今天我学到了一些新东西,谢谢你教我!刚刚接受了这个作为我的答案和a+1!谢谢@choroba您的版本会在循环的每次迭代中覆盖文件。当然会!如果改为“>>”,它会工作,但我必须记住它将始终追加,在我的情况下,我想更新列表,但只需在脚本顶部放置一个命令,首先擦除列表即可解决此问题,或者删除并再次触摸它。谢谢你教我两次!另一个+1来自我!