使用“-z”测试 $1 或 $2 是否为空 - BASH

使用“-z”测试 $1 或 $2 是否为空 - BASH

我正在同一个脚本中进行多个 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" \) ];

相关内容