我正在同一个脚本中进行多个 raid 监控,并且我想让脚本在任一变量返回 null 时发送警报/变为红色。
我尝试阅读并认为我已经掌握了,但我的尝试最终从未失败。
为了测试,我让它 grep 失败,这应该会导致它失败,但到目前为止,我无法让它失败,它实际上总是会通过。
测试环境如下所示:
var="$(sudo /usr/StorMan/arcconf GETCONFIG 1 LD 0 | grep Optimal)"
var1="$(sudo /usr/StorMan/arcconf GETCONFIG 1 LD 1 | grep fail)"
这适用于 1 个变量
if [ -z "$var" ]
我努力了
if [ -z "$var" ] && [ -z "$var1" ]
if [ -z "$var" && -z "$var1" ]
if [[ -z "$var" && -z "$var1" ]]
但无济于事,我相信有人会立刻知道我做错了什么,我很感谢花时间阅读这篇文章!
答案1
使用||
而不是&&
,例如
if [ -z "$var" ] || [ -z "$var1" ]
这bash手册解释一下:
和和或者列表是由控制运算符分隔的一个或多个管道的序列
&&
和||
, 分别。和和或者列表以左关联性执行。
答案2
您所要求的内容已经提到过:
if [ -z "$var" ] || [ -z "$var1" ]; then
echo "one or both are empty."
fi
但是,值得一提的是,如果这是您对这些变量的唯一用途,则无需将它们设置为变量。
您可以直接在构造中检查命令的退出状态if
- 事实上[
是一个命令,而不是一个特殊的 shell 标记。 (它与命令完全相同test
;请参阅man [
)
据我了解,第一个sudo
命令的输出必须包含“Optimal”,第二个命令的输出必须包含“fail”,否则您想触发警报。
在我看来,你可以更清楚地讨论这个问题,如下所示:
if sudo /usr/StorMan/arcconf GETCONFIG 1 LD 0 | grep -q Optimal &&
sudo /usr/StorMan/arcconf GETCONFIG 1 LD 1 | grep -q fail
then
echo "All is well."
else
echo "Error condition!"
fi
答案3
如果您希望“任一”变空,也许可以尝试 OR ||
?
if [ -z "$var" ] || [ -z "$var1" ]
……有那么容易吗?
答案4
两种解决方案是:
if [[ -z $a || -z $b ]]; ### (not A) OR (not B)
if ! [[ $a && $b ]]; ### not (A and B)
更便携:
if [ -z "$a" ] || [ -z "$b" ];
if ! ( [ "$a" ] && [ "$b" ] );
此选项可能有效,但被 POSIX 拒绝(>4 个参数:结果未指定。):
if [ -z "$a" -o -z "$b" ];
if [ ! \( "$a" -a "$b" \) ];