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 楼
更简单的方法是: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"
,那么您就处于一个受伤的世界。这也将使人们更容易发现是什么。
不是必须要考虑的,而是要认真考虑的。一个功能的好人选。这主要使代码更易于阅读和维护。例如:
valid_phone_type()
{
case "" in
"NORTEL"|"NEC")
return 0;;
*)
echo "Model is not supported"
return 1;;
esac
}
if ! valid_phone_type "$phone_type"; then
echo "Bye."
exit 1
fi
#4 楼
您应该使用AND,而不是OR。if [ "$PHONE_TYPE" != "NORTEL" ] && [ "$PHONE_TYPE" != "NEC" ] && [ "$PHONE_TYPE" != "CISCO" ]
then
或
if [ "$PHONE_TYPE" != "NORTEL" -a "$PHONE_TYPE" != "NEC" -a "$PHONE_TYPE" != "CISCO" ]
then
#5 楼
要更正以上答案(我目前无法评论):PHONE_TYPE="NORTEL"
if [[ $PHONE_TYPE =~ ^(NORTEL|NEC|CISCO|SPACE TEL)$ ]]; then
echo "Phone type accepted."
else
echo "Error! Phone type must be NORTEL, CISCO or NEC."
fi
请注意,使用=〜
它在bash 3中不起作用。
我在MS Windows 7上使用bash 4.3.46(可以正常工作)和bash 3.1.17(无法工作)进行了测试
=〜的LHS应该用引号引起来。在上方,PHONE_TYPE =“ SPACE TEL”也将匹配。
#6 楼
使用[[代替if [[ "$PHONE_TYPE" != "NORTEL" ]] || [[ "$PHONE_TYPE" != "NEC" ]] ||
[[ "$PHONE_TYPE" != "CISCO" ]]
then
echo "Phone type must be nortel,cisco or nec"
exit 1
fi
评论
当然,这是错误的。 [[vs [不利于关闭逻辑。
–ilkkachu
19年2月12日在20:10
#7 楼
只是基于@ 0x80解决方案的变体建议:# define phone brand list
phoneBrandList=" NORTEL NEC CISCO" ## separator is space with an extra space in first place
# test if user given phone is contained in the list
if [[ ${phoneBrandList} =~ (^|[[:space:]])"${userPhoneBrand}"($|[[:space:]]) ]]; then
echo "found it !"
fi
评论
我认为应该是[[! $ PHONE_TYPE =〜^(NORTEL | NEC | CISCO)$]];然后
–米兰·西梅克(Milan Simek)
19年4月11日在23:55