2 Matriz Dimensional Erro no shell

0
#!/bin/bash
i=$(awk '{x++} END {print x}' mibwithtraps)
echo $i
IFS=","
while read f1 f2 f3 f4
   do
      echo "hell :$f4"
done < mibwithtraps

Isso imprime isso:

7
hell :CRITICAL,
hell :INFORMATIONAL,
hell :CRITICAL,
hell :INFORMATIONAL,
hell :INFORMATIONAL,
hell :INFORMATIONAL,
hell :CRITICAL,

Eu quero armazená-los em uma matriz, todas as minhas tentativas falharam. Eu tentei isso:

for ((w=1; w<=i; w++))
    do
       while read f1 f2 f3 f4
          do
             a[$w]= echo $f4
       done
done < mibwithtraps
echo ${a[2]}

E o que isso faz é imprimir isso:

7
CRITICAL
INFORMATIONAL
CRITICAL
INFORMATIONAL
INFORMATIONAL
INFORMATIONAL
CRITICAL

Todos eles estão sendo armazenados na matriz como uma coisa toda. Eu quero que eles sejam separados para que quando eu fizer:

echo ${a[2]}

Isso deve acontecer:

INFORMATIONAL
    
por SamFlynn 15.06.2015 / 07:04

1 resposta

1

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]}
    
por kos 15.06.2015 / 08:18