在bash中检查多个变量的输出

时间:2013-06-14 20:25:33

标签: linux bash shell scripting centos

现在我在我的bash脚本中将多个命令定义为变量,如下所示:

LSIBATTSTATE=`/var/lib/einarc/tools/lsi_megacli/cli -AdpBbuCmd -GetBbuStatus -aALL | grep 'Operational'`
LSIBATT=`/var/lib/einarc/tools/lsi_megacli/cli -AdpBbuCmd -GetBbuStatus -aALL | grep 'isSOHGood: Yes'`
LSIWB=`/var/lib/einarc/tools/lsi_megacli/cli -LDinfo -Lall -Aall | grep 'WriteBack'`
ADAPZMM=`einarc ad info | grep 'ZMM Optimal'`

这是其中的4个,但有可能会有更多。 (这适用于RAID控制器)。

我想要做的是弄清楚如何检查所有这些变量的输出以获得返回结果。基本上,某种类似的东西,而不必为每个做一个if / then语句:

ps cax | grep httpd > /dev/null
  if [ $? -eq 0 ]; then
  <do some stuff>
fi

如果找到了所需的输出,则脚本会继续前进并忽略它。但是,如果找不到所需的输出(即返回结果为空),那么我希望它执行一个动作。我认为在bash中真正做到这一点的唯一方法是使用for循环,但我不确定这是否是最好或最有效的方法。此外,在这种情况下,数组是否有用?这对我来说似乎不是这样,但是我仍然有很多事情我不喜欢在bash中。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

这会将所有结果放在一个数组中,然后迭代它以查找任何空结果。

results=("`/var/lib/einarc/tools/lsi_megacli/cli -AdpBbuCmd -GetBbuStatus -aALL | grep 'Operational'`" 
         "`/var/lib/einarc/tools/lsi_megacli/cli -AdpBbuCmd -GetBbuStatus -aALL | grep 'isSOHGood: Yes'`" 
         "`/var/lib/einarc/tools/lsi_megacli/cli -LDinfo -Lall -Aall | grep 'WriteBack'`
ADAPZMM=`einarc ad info | grep 'ZMM Optimal'`" )
all_succeeded=1
for result in "${results[@]}"; do
  if [ -z "$result" ]
  then echo Something failed.
       all_succeeded=0
       break
  fi
done

答案 1 :(得分:0)

test命令允许复合语句。如果您只想检查每个字符串是否为空:

if [ -z "$LSIBATTSTATE" -o -z "$LSIBATT" -o -z "$LSIWB" -o -z "$ADAPZMM" ]; then
  [error stuff]
fi

如果你想要一些更具可扩展性的东西,你可以运行数组或结果代码的总和:

初​​始化

RESULTS=()
RESULTSUM=0

每个命令后更新

RESULT=$?
RESULTS[${#RESULTS[*]}]=$RESULT
RESULTSUM=$(($RESULTSUM + $RESULT))

然后完成所有工作后:

if [ $RESULTSUM -eq 0 ]; then
  [error stuff which can use $RESULTS array to know which command failed]
fi