现在我在我的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中。
任何帮助都将不胜感激。
答案 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