我尝试检查PHONE_TYPE
变量是否包含三个有效值之一。
if [ "$PHONE_TYPE" != "NORTEL" ] || [ "$PHONE_TYPE" != "NEC" ] ||
[ "$PHONE_TYPE" != "CISCO" ]
then
echo "Phone type must be nortel,cisco or nec"
exit
fi
上面的代码对我来说不起作用,所以我尝试了这个:
if [ "$PHONE_TYPE" == "NORTEL" ] || [ "$PHONE_TYPE" == "NEC" ] ||
[ "$PHONE_TYPE" == "CISCO" ]
then
: # do nothing
else
echo "Phone type must be nortel,cisco or nec"
exit
fi
是否有更清洁的方法来完成此类任务?
答案1
我猜您正在寻找:
if [ "$PHONE_TYPE" != "NORTEL" ] && [ "$PHONE_TYPE" != "NEC" ] &&
[ "$PHONE_TYPE" != "CISCO" ]
这些等价物的规则称为德摩根定律在你的情况下意味着:
not(A || B || C) => not(A) && not(B) && not (C)
请注意布尔运算符 or 和 and 的变化。
而你试图这样做:
not(A || B || C) => not(A) || not(B) || not(C)
这显然是行不通的。
答案2
如果使用 bash,更短的方法是:
if [[ ! $PHONE_TYPE =~ ^(NORTEL|NEC|CISCO)$ ]]; then
echo "Phone type must be nortel, cisco or nec."
fi
^
– 匹配行首的开头$
– 匹配行尾=~
- Bash 的内置正则表达式比较运算符
答案3
很好的答案,也是宝贵的一课;)只想补充一个注释。
选择使用哪种类型的测试很大程度上取决于代码、结构、环境等。
另一种方法是使用 switch 或case
语句,如下所示:
case "$PHONE_TYPE" in
"NORTEL"|"NEC"|"CISCO")
echo "OK"
;;
*)
echo "Phone type must be nortel,cisco or nec"
;;
esac
第二个注意事项是使用大写变量名时应小心。这是为了防止系统引入的变量之间发生冲突,这些变量几乎总是大写的。因此$phone_type
代替$PHONE_TYPE
.
虽然这样是安全的,但如果您有使用全部大写的习惯,有一天您可能会说IFS="boo"
,您正处于一个受伤的世界中。
它还将使您更容易发现哪个是什么。
不是一个必须但a会强烈考虑。
它也可能是一个很好的函数候选者。这主要使代码更易于阅读和维护。例如:
valid_phone_type()
{
case "$1" in
"NORTEL"|"NEC")
return 0;;
*)
echo "Model $1 is not supported"
return 1;;
esac
}
if ! valid_phone_type "$phone_type"; then
echo "Bye."
exit 1
fi
答案4
POSIX 的可移植性较差,但可以在 Bash 中使用:
if [[ $PHONE_TYPE != @(NORTEL|NEC|CISCO) ]]; then
echo 'Phone type must be NORTEL, CISCO, or NEC' >&2
exit 1
fi