Bash 使用 OR 和 NOT 进行多字符串比较

Bash multiple string comparison with OR and NOT

从磁盘阵列中提取磁盘状态,我得到 "ready" 和 "online" 作为 OK 状态。试图用 bash 中的 IF 语句来捕获它,如果值是 其他 而不是 "ready" 和 "online".[=12,它将起作用=]

下面的代码片段可用于捕获 "OK" 但我想反转它,因此如果 $diskstatus 未就绪或未在线则它会捕获。

#!/bin/bash
diskstatus="online"
if [[ $diskstatus = online ]] || [[ $diskstatus = ready ]]; then echo "OK: $diskstatus"; fi

现在已经尝试了几乎所有带有括号、引号和诸如此类的东西,但没有任何效果。

使用 bash 中的 regex 运算符和 [[ 运算符,如下所示,

[[ ! $diskstatus =~ ^(ready|online)$ ]] && echo "Not OK: $diskstatus"

此外,请注意 regex 或变量部分不需要 double-quotes,因为 word-splitting路径名扩展(globbing) 将在此上下文中执行

另一种 POSIX 方法,添加到 将是

if [ "$diskstatus" != "ready" ] && [ "$diskstatus" != "online" ]; then  echo "Not OK: $diskstatus"; fi

简单地反转相等性和逻辑运算符似乎对我有用

$ diskstatus=onlin
$ if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "NOK: $diskstatus"; fi
NOK: onlin

由于两者都需要为假,所以您必须使用and语句。

if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "OK: $diskstatus"; fi

否则,由于至少有一个条件始终为真,您的 if 语句的主体将始终 运行。

为了完整起见,还要考虑 case 语句。

case $diskstatus in
    online | ready) ;;
    *) echo "Not ok: $diskstatus";;
esac

语法起初可能看起来很神秘,但您很快就会习惯它。对于涉及简单字符串模式匹配的许多事情,我实际上更喜欢它而不是 if。作为奖励,它与传统的 sh.

兼容