从磁盘阵列中提取磁盘状态,我将“准备好”和“在线”状态作为OK状态。试图用bash中的IF语句来捕获它,如果值是其他而不是“ready”和“online”,那么它将起作用。
下面的代码片段用于捕获“确定”,但我想将其反转,因此如果$ diskstatus未准备就绪或在线,则会陷阱。
#!/bin/bash
diskstatus="online"
if [[ $diskstatus = online ]] || [[ $diskstatus = ready ]]; then echo "OK: $diskstatus"; fi
现在几乎用括号,引号和诸如此类的东西尝试了几乎所有东西,但没有让它起作用。
答案 0 :(得分:3)
为了完整起见,还要考虑case
声明。
case $diskstatus in
online | ready) ;;
*) echo "Not ok: $diskstatus";;
esac
一开始语法看起来很神秘,但你很快就习惯了。对于涉及简单字符串模式匹配的许多事情,我实际上倾向于优先于if
。作为奖励,它与传统的sh
兼容。
答案 1 :(得分:2)
使用regex
与bash
运算符中的[[
运算符,如下所示,
[[ ! $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语句的主体将始终运行。