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

时间:2017-02-20 08:33:34

标签: bash logical-operators

从磁盘阵列中提取磁盘状态,我将“准备好”和“在线”状态作为OK状态。试图用bash中的IF语句来捕获它,如果值是其他而不是“ready”和“online”,那么它将起作用。

下面的代码片段用于捕获“确定”,但我想将其反转,因此如果$ diskstatus未准备就绪或在线,则会陷阱。

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

现在几乎用括号,引号和诸如此类的东西尝试了几乎所有东西,但没有让它起作用。

4 个答案:

答案 0 :(得分:3)

为了完整起见,还要考虑case声明。

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

一开始语法看起来很神秘,但你很快就习惯了。对于涉及简单字符串模式匹配的许多事情,我实际上倾向于优先于if。作为奖励,它与传统的sh兼容。

答案 1 :(得分:2)

使用regexbash运算符中的[[运算符,如下所示,

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

另外,请注意regex或变量部分不需要双引号,因为分词路径名扩展(globbing)将在此上下文中执行

另一种POSIX方式,添加到tripleee's answer将是

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

答案 2 :(得分:0)

简单地颠倒平等和逻辑运算符似乎对我有用

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

答案 3 :(得分:0)

由于两个都需要为false,因此您必须使用and语句。

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

否则,因为至少有一个条件总是为真,所以if语句的主体将始终运行。