Seu programa falha principalmente em sua lógica.
for ((w=1; w<=i; w++))
do
while read f1 f2 f3 f4
do
a[$w]= echo $f4
done
done < mibwithtraps
echo ${a[2]}
Primeiro, for ((w=1; w<=i; i++)); do [...]; done < mibwithtraps
não faz sentido, pois você está redirecionando o conteúdo de mibwithtraps
para um loop for
. Loops não têm stdin
, eles são uma construção de linguagem, não comandos; Suponho que você queira redirecionar o conteúdo de mibwithtraps
para read
: while read f1 f2 f3 f4; do [...]; done < mibwithraps
.
Segundo, você está armazenando o conteúdo de $f4
a partir de $a{[1]}
, que é a segunda posição da matriz, e você está usando a sintax errada; para armazenar a saída de um comando desta forma você tem que executá-lo em um subshell ( a[$w]=$(echo $f4)
, porém você nem precisa fazer isso, porque você pode simplesmente atribuir o valor de $4
ao array ( a[$w]=$f4
), mas além disso você está armazenando para cada for
loop cada quarto ,
-separated campo de cada linha de mibwithtraps
na mesma posição da matriz, como resultado, com a correção acima você teria um array $a
contendo o mesmo quarto% de campos separados por,
da última linha do valor de mibwithtraps
da segunda posição para a posição oito.
Para resolver isso, e como regra geral, sugiro que você armazene os valores no array enquanto realiza o loop pela primeira vez; é inútil percorrer duas vezes. Como as matrizes (como qualquer variável) não precisam ser declaradas em bash
, você pode atribuir diretamente um valor a uma matriz não declarada; você também pode acrescentar um elemento a um array existente / não existente usando a sintax array+=(<value>)
:
#!/bin/bash
i=$(awk '{x++} END {print x}' mibwithtraps)
echo $i
IFS=","
while read f1 f2 f3 f4
do
echo "hell :$f4"
a+=("$f4")
done < mibwithtraps
echo ${a[1]}