将命令的输出分配给数组

将命令的输出分配给数组

当我运行这个命令时:

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

这是解决此问题的一种方法:

创建数组

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

相关内容