显然这是不正确的,这就是我在这里的原因。请帮我告诉我。
我正在迭代一个文件。我正在取一些字段并将它们分配给数组的索引。对于循环的每次传递,我想更改数组的名称。例如,在循环的第一遍中,我想为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。然后我做出选择,只将选定的行/字段添加到变量。问题解决了。谢谢大家。
答案 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
生效。