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

Bash使用OR和NOT进行多字符串比较,bash,logical-operators,Bash,Logical Operators,从磁盘阵列中提取磁盘状态,我准备好并联机作为OK状态。尝试在bash中使用IF语句来捕获该值,如果值不是ready和online,则该语句将起作用 下面的代码片段用于捕获OK,但我想将其反转,以便在$diskstatus未就绪或未联机时捕获 #!/bin/bash diskstatus="online" if [[ $diskstatus = online ]] || [[ $diskstatus = ready ]]; then echo "OK: $diskstatus"; fi 现在,我

从磁盘阵列中提取磁盘状态,我准备好并联机作为OK状态。尝试在bash中使用IF语句来捕获该值,如果值不是ready和online,则该语句将起作用

下面的代码片段用于捕获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"
此外,请注意,正则表达式或变量部分都不需要双引号,因为在此上下文中不会执行单词拆分或路径名扩展lobbing

另一种POSIX方法是

if [ "$diskstatus" != "ready" ] && [ "$diskstatus" != "online" ]; then  echo "Not OK: $diskstatus"; fi
在bash中使用正则表达式运算符和[[运算符,如下所示

[[ ! $diskstatus =~ ^(ready|online)$ ]] && echo "Not OK: $diskstatus"
此外,请注意,正则表达式或变量部分都不需要双引号,因为在此上下文中不会执行单词拆分或路径名扩展lobbing

另一种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

简单地反转等式和逻辑运算符似乎对我有效

$ diskstatus=onlin
$ if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "NOK: $diskstatus"; fi
NOK: onlin
因为两者都必须为false,所以必须使用and语句

if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "OK: $diskstatus"; fi
case $diskstatus in
    online | ready) ;;
    *) echo "Not ok: $diskstatus";;
esac
否则,由于至少有一个条件始终为true,if语句的主体将始终运行。

由于两者都必须为false,因此必须使用and语句

if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "OK: $diskstatus"; fi
case $diskstatus in
    online | ready) ;;
    *) echo "Not ok: $diskstatus";;
esac

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

< P>只是为了完整性,还要考虑case语句。

if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "OK: $diskstatus"; fi
case $diskstatus in
    online | ready) ;;
    *) echo "Not ok: $diskstatus";;
esac

语法可能起初看起来晦涩难懂,但你很快就习惯了。如果涉及到简单的字符串模式匹配,我实际上倾向于它。作为一个奖励,它与传统的SH兼容。

< P>只是为了完整性,还要考虑case语句。

if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "OK: $diskstatus"; fi
case $diskstatus in
    online | ready) ;;
    *) echo "Not ok: $diskstatus";;
esac

语法一开始可能看起来很难懂,但你很快就会习惯。事实上,在涉及简单字符串模式匹配的许多事情上,我倾向于使用它而不是if。作为奖励,它与传统的sh兼容。

没有理由在这里导出变量。@tripleee你是对的,我删除了无用但无害的导出。没有理由这样做n在这里导出变量。@tripleee你是对的,我删除了无用但无害的导出我脑子里有这个解决方案,但我一直在绞尽脑汁如何使它工作。干得好。感谢正则表达式的多样性,为了可读性,它非常优雅。我会选择这个:我脑子里有这个解决方案,但我一直在绞尽脑汁o让它工作起来。干得好。感谢regex的多样性,为了可读性,它非常优雅。我将选择这个:谢谢,我没有想到。我在命令输入参数解析中经常使用case。谢谢,我没有想到这一点。我在命令输入参数解析中经常使用case。