使用variables名创build一个数组bash,unix

首先我也许应该解释我想要做什么…

  • 我有'n'数量的文件'n'的行数量。 我所知道的是,行数将是偶数。
  • 用户select他们想要的文件。 这被保存到一个名为${selected_sets[@]}数组中。
  • 该程序将打印从随机select的文件中随机select“奇数”行。
  • 一旦线已经打印,我不希望它再次打印…

大部分是没问题的,但是我根据${selected_sets[@]}的内容创build数组时遇到了麻烦……我想我的语法全错了:)

 for i in ${selected_sets[@]} do x=1 linecount=$(cat $desired_path/$i | wc -l) #get line count of every set while [ $x -le $linecount ] do ${i}[${#${i}[@]}]=$x x=$(($x+2)) # only insert odd numbers up to max limit of linecount done done 

问题是${i}[${#${i}[@]}]=$x我知道我可以使用array[${#array[@]}]=$x但我不知道使用variables名称。

任何想法将是最受欢迎的(我真的难住)!

一般来说,这个类型是用eval解决的问题。 如果你想要一个名为“foo”的变量并且有一个变量bar =“foo”,你只需要:

 eval $ bar = 5

Bash(或任何sh)对待,就好像你已经键入

富= 5

所以你可能只需要写:

 eval $ {i} [\ $ {#$ {i} [@]}] = $ x

与合适的逃生。 (一个有用的技术是用'echo'替换'eval',运行脚本并检查输出,并确保它看起来像你想要评估的。)

您可以使用declare命令创建命名变量

 declare -a name=${#${i}[@]} 

我只是不确定你将如何引用这些变量,我现在没有时间来调查。

使用数组:

 declare -a myArray for i in ${selected_sets[@]} do x=1 linecount=$(cat $desired_path/$i | wc -l) #get line count of every set while [ $x -le $linecount ] do $myArray[${#${i}[@]}]=$x let x=x+1 #This is a bit simpler! done done 

谨防! 我没有测试任何上述。 HTH