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
.
兼容
从磁盘阵列中提取磁盘状态,我得到 "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
.