atribui a saída do comando ao array

3

Quando eu executo este comando:

cat output | grep -i state | sort | uniq | awk '{print $ 3}')

a saída é:

00x1
00x5
0080

Para atribuí-los a uma matriz, eu fiz isso:

STATUS_ARRAY=($(cat output | grep -i state | sort | uniq | awk '{print $ 3}')) 

mas não funcionou. Para cada sistema, a saída desse comando é diferente e eu quero verificar cada um deles.
Por exemplo - existem 21 tipos de status! - este código:

for STATUS in "${STATUS_ARRAY=[@]}"
do
  if [ "$STATUS" == '00x1' ] && [ "$STATUS" == '00x5' ];
  then
    echo " everything is normal"
  else [ "$STATUS" == '0080' ];
    echo " check your system "
  fi 
done  

mas quando a matriz não funciona, ela não retorna nada. O que está errado com isto?

O conteúdo de output é:

State                                = 00x1
State                                = 00x5
State                                = 0080
    
por BlackCrystal 20.10.2018 / 12:03

2 respostas

2

Esta é uma maneira de resolver isso:

Crie o array

mapfile -t array < <(awk '{printf("%s\n", $NF)}' output)

Em seguida, percorra os índices e faça o que quiser com base no índice. por exemplo:

for status in "${array[@]}"
 do 
  if [[ $status == @(00x1|00x5) ]]
   then echo "All ok"
  else echo "All NOT ok"
  fi 
 done
    
por 20.10.2018 / 13:29
2

Que tal usar uma "string aqui", "expansão de parâmetro" e um case ... esac contruct?

readarray -t TMP <<< $(grep -i "state" output | sort -u)
for STATUS in "${TMP[@]##* }"
  do    case $STATUS in
                00x[15]) echo "everything normal";;
                0080)    echo "check system";;
                *)       echo "error: status unknown";;
        esac
  done
check system
everything normal
everything normal
    
por 20.10.2018 / 14:26