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]}