コマンドの出力を配列に割り当てる

コマンドの出力を配列に割り当てる

このコマンドを実行するとき:

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

出力は次のとおりです

00x1
00x5
0080

配列に割り当てるには、次の手順を実行します。

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

しかし、成功しませんでした。このコマンドの出力はシステムによって異なりますので、それぞれを確認したいと思います。
たとえば、21の州があります。 -- このコードは次のとおりです。

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  

しかし、配列が機能しない場合は何も返されません。これは何の問題ですか?

その内容はoutput次のとおりです。

State                                = 00x1
State                                = 00x5
State                                = 0080

答え1

この問題を解決する1つの方法は次のとおりです。

配列の作成

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

その後、インデックスを繰り返し、インデックスに基づいて必要なすべての操作を実行します。たとえば、

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

答え2

「ここに文字列」、「パラメータ拡張」、およびcase...構造を使用するesacのはどうですか?

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

関連情報