Bash嵌套循环行为

时间:2017-11-03 11:06:33

标签: bash loops for-loop while-loop

我遇到嵌套循环问题。代码如下所示:

while IFS='' read -r line || [[ -n "$line" ]]; do
    num=0
    for i in $line; do
        eval a_${num}="\"$(echo $i)\""
        echo $a_0
        ((num=num+1))
    done
done < file

在文件中有很多行。每行包含16个空格分隔值:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

当我读取文件中的每一行时, i 的第一次出现应设置为变量 a_0

因此,当我回显此值时,如果文件中有两个相同的行,则应该读取:

01
01

然而,这就是:

01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01
01

而不是回显两次,它将迭代行中值的两倍 - 16 + 16次。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

一段时间后,这段代码(几乎)解决了我的问题:

file=`cat files.txt`

# read the lines in the file and store every line in variable as "line"
while read -r line; do
# declare an array variable from every space separated value in "line"
  declare -a arr=`echo $line`
# set counter to zero
  num=0
# now loop through the above array
  for i in ${arr[*]}; do
# set a variable as "a_$num" that equals the current value in array
  eval a_${num}="'\"$(echo $i)\"'"
# incremenate "num" by 1 
  ((num=num+1))
  done
# echo the first value in current line
  echo $a_0
done <<< $file

现在结果应该是:

01
01

....但由于某种原因,即使有两行,它也只会被回复一次:

01

我仍然可以使用该脚本。任何人都可以解决最后一点它会很棒!