Bash 是否可以使用在循环中更改其名称的变量作为shell脚本中函数的输入?

Bash 是否可以使用在循环中更改其名称的变量作为shell脚本中函数的输入?,bash,shell,sh,Bash,Shell,Sh,我的目的是读取多个文件并将数据记录在相应的数组中。 然后将进一步处理该阵列。 例如: 是否可以使用shell脚本来实现这一点(bash也可以)? 还有其他方法吗? 请提出建议。 谢谢 关于我的目标的一点更新:我想读取文件夹中的文件,标记所有重复项,并计算文件中重复项的出现次数。然后,为文件夹中的每个文件提供一个摘要,说明有多少唯一项、有多少重复项以及重复项出现的时间。(重复项只应出现在文件之间) 我的原始脚本读取文件夹中的所有文件,使用awk获取所有副本和事件(保存到all_dup的文件),然后

我的目的是读取多个文件并将数据记录在相应的数组中。 然后将进一步处理该阵列。 例如:

是否可以使用shell脚本来实现这一点(bash也可以)? 还有其他方法吗? 请提出建议。 谢谢

关于我的目标的一点更新:我想读取文件夹中的文件,标记所有重复项,并计算文件中重复项的出现次数。然后,为文件夹中的每个文件提供一个摘要,说明有多少唯一项、有多少重复项以及重复项出现的时间。(重复项只应出现在文件之间)

我的原始脚本读取文件夹中的所有文件,使用awk获取所有副本和事件(保存到all_dup的文件),然后将每个文件与all_dup进行比较(使用awk),为每个_file_dup,每个_file_uniq

我正在考虑通过将数据写入数组而不是文件来加快速度。 但不确定它是否真的有效。 文件从数百行到数千行不等(长整型)。
谢谢您的建议。

将多个文件读入一个数组非常简单

arrayName=( $( cat file1 file2 $someGlob ) )
如果文件名作为数组名也有效,则可以使用动态求值

$: grep . ?
a:1
a:2
a:3
b:4
b:5
b:6
c:7
c:8
c:9

$: lst=(?)
$: set -x; for f in ${lst[@]}; do eval "$f=(\$(<$f))"; eval : "$f: \${${f}[@]}"; done; set +x
+ for f in ${lst[@]}
+ eval 'a=($(<a))'
++ a=($(<a))
+ eval : 'a: ${a[@]}'
++ : a: 1 2 3
+ for f in ${lst[@]}
+ eval 'b=($(<b))'
++ b=($(<b))
+ eval : 'b: ${b[@]}'
++ : b: 4 5 6
+ for f in ${lst[@]}
+ eval 'c=($(<c))'
++ c=($(<c))
+ eval : 'c: ${c[@]}'
++ : c: 7 8 9

这将使用名称
\u tmp\u proc\u test\u 2
文件的数组
/tmp/proc/test/2

将多个文件读入一个数组非常简单

arrayName=( $( cat file1 file2 $someGlob ) )
如果文件名作为数组名也有效,则可以使用动态求值

$: grep . ?
a:1
a:2
a:3
b:4
b:5
b:6
c:7
c:8
c:9

$: lst=(?)
$: set -x; for f in ${lst[@]}; do eval "$f=(\$(<$f))"; eval : "$f: \${${f}[@]}"; done; set +x
+ for f in ${lst[@]}
+ eval 'a=($(<a))'
++ a=($(<a))
+ eval : 'a: ${a[@]}'
++ : a: 1 2 3
+ for f in ${lst[@]}
+ eval 'b=($(<b))'
++ b=($(<b))
+ eval : 'b: ${b[@]}'
++ : b: 4 5 6
+ for f in ${lst[@]}
+ eval 'c=($(<c))'
++ c=($(<c))
+ eval : 'c: ${c[@]}'
++ : c: 7 8 9

这将使用名称
\u tmp\u proc\u test\u 2
文件的数组
/tmp/proc/test/2

动态变量名是可能的(请参阅),但通常比较混乱且容易出错。我建议尝试重新构造代码,这样就不需要了。是的,我正在考虑,但还没有提出任何好的想法。谢谢。这可能是一个问题吗?请详述“获取所有副本”的详细信息。你是说一个文件中的重复?还是跨文件?如果你能写出清晰的规范,我相信我们能想出一些快速且相对简单的方法,或者至少是干净的方法我认为你最好把这篇文章写在bash以外的东西上;数据结构合理的东西。我更喜欢Python,但是有很多好的选择。Shell脚本很适合告诉其他程序处理复杂的数据,但不适合直接处理复杂和/或大型数据集。动态变量名是可能的(请参阅),但通常比较混乱,容易出错。我建议尝试重新构造代码,这样就不需要了。是的,我正在考虑,但还没有提出任何好的想法。谢谢。这可能是一个问题吗?请详述“获取所有副本”的详细信息。你是说一个文件中的重复?还是跨文件?如果你能写出清晰的规范,我相信我们能想出一些快速且相对简单的方法,或者至少是干净的方法我认为你最好把这篇文章写在bash以外的东西上;数据结构合理的东西。我更喜欢Python,但是有很多好的选择。Shell脚本很适合告诉其他程序使用数据执行复杂的操作,但不适合直接使用复杂和/或大型数据集。非常感谢您的回复。我一定会考虑重新设计。我以前也使用temp文件来保存数据,但它的速度变慢了,所以我想也许可以使用variable来加速它。这取决于您对数据所做的操作。你能不能备份并解释一下你试图实现的目标,而不是你在尝试新方法时看到的问题?我更新了一些关于我的目标的信息,请参见上文。谢谢。非常感谢你的回复。我一定会考虑重新设计。我以前也使用temp文件来保存数据,但它的速度变慢了,所以我想也许可以使用variable来加速它。这取决于您对数据所做的操作。你能不能备份并解释一下你试图实现的目标,而不是你在尝试新方法时看到的问题?我更新了一些关于我的目标的信息,请参见上文。谢谢
flist=( /tmp/proc/test/* )
for f in "${flist[@]}"
do echo "${f//[/]/_}=(\$(<$f))" >| tmpfile; 
  . tmpfile; 
done