0

现在,我在我的 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 中我仍然不擅长做很多事情。

任何帮助,将不胜感激。

4

2 回答 2

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
于 2013-06-14T20:44:35.670 回答
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
于 2013-06-14T20:31:38.870 回答