语法问题或在bash中使用间接引用来命名数组

时间:2016-12-23 20:35:59

标签: arrays bash reference

显然这是不正确的,这就是我在这里的原因。请帮我告诉我。

我正在迭代一个文件。我正在取一些字段并将它们分配给数组的索引。对于循环的每次传递,我想更改数组的名称。例如,在循环的第一遍中,我想为array1分配索引,第二次将索引赋值给array2,依此类推,直到达到文件中的行数,或者总数= $(wc -l< file )

#!/bin/bash
total=$(wc -l < file)
counter=0
  while [ $counter -ne $total ]
    do
      (( counter = counter + 1 ))
        name=array$counter
        name[0]=$(cat file | sed "${counter}q;d" | cut -d '|' -f1)
        name[1]=$(cat file | sed "${counter}q;d" | cut -d '|' -f2)
        name[2]=$(cat file | sed "${counter}q;d" | cut -d '|' -f3)
        name[4]=$(cat file | sed "${counter}q;d" | cut -d '|' -f6)
        echo $counter ${name[4]}
    done
read -p "enter a number: " number

我希望这是有道理的。它应该是相当简单的事情,我想我只是有一个语法问题。从我在研究中可以找到的东西,我需要使用间接参考。

我有一个文件,其中包含1-50行,可能更多。每行将是由|分隔的6个字段符号。我想在前面列出带有$ counter的第6列(这将作为菜单)。然后用户将选择一个数字(即时使用read -p "enter a number: " number。然后一个命令将使用一些变量(-f1和-f2)执行相应的数组

我输入文件的一个示例:

abcdefghijklm|10|-45|476|85f|someString1
jydbefgsdffty|01|-95|423|73c|someString2
jgrtefghijksd|31|-75|920|75a|someString3

我希望输出看起来像这样:

1 someString1
2 someString2
3 someString3

enter a number: 
我提出了另一种方法。由于我不需要将所有数据存储为变量(我使用菜单来选择一个特定的行并仅使用其数据),然后我列出我想要的所有行/字段用cat命令管道进行sed和cut。然后我做出选择,只将选定的行/字段添加到变量。问题解决了。谢谢大家。

2 个答案:

答案 0 :(得分:0)

迭代文件的正确方法是使用调用while的{​​{1}}循环,这可以为您分割行。

read

答案 1 :(得分:0)

尽管您想出了另一种方法,但我会解决您原来的问题。

  

…在循环的第一遍中,我想将索引分配给array1,第二遍将索引分配给array2,依此类推……

     

从研究中可以发现,我需要使用间接参考。

好吧,较新版本的bash可以选择使用nameref属性声明变量;这样,您只需要将name=array$counter更改为declare -n name=array$counter,您的脚本便可以按需运行。

较旧版本的bash(将使用declare: -n: invalid option响应上述内容)也具有特殊的间接语法,但不适用于数组。对于这样的版本,我们不得不求助于eval并适当使用\来获得特定的评估顺序:

        name=array$counter
        eval $name[0]=$(cat file | sed "${counter}q;d" | cut -d '|' -f1)
        eval $name[1]=$(cat file | sed "${counter}q;d" | cut -d '|' -f2)
        eval $name[2]=$(cat file | sed "${counter}q;d" | cut -d '|' -f3)
        eval $name[4]=$(cat file | sed "${counter}q;d" | cut -d '|' -f6)
        eval echo $counter \${$name[4]}

最后一行中的\具有将第一个$name展开的效果,例如G。到array1,并且只有在${array1[4]}之后才eval生效。