bash测试中的OR逻辑运算符
这项测试似乎不能正常进行。为什么? 我需要一个脚本,它接受第一个参数,检查它是哪个字母,并完成这项工作。如果字母是a、b、c或d,则退出,否则为右bash测试中的OR逻辑运算符,bash,logical-operators,Bash,Logical Operators,这项测试似乎不能正常进行。为什么? 我需要一个脚本,它接受第一个参数,检查它是哪个字母,并完成这项工作。如果字母是a、b、c或d,则退出,否则为右 letter=$1 [[ $letter != a || $let
letter=$1
[[ $letter != a || $letter != b || $letter != c || $letter != d ]] && echo exiting && exit 1
if [[ $letter == a ]]
then
echo correct
fi
让我们举一个更简单的例子:
[$letter!=a | |$letter!=b]
无论字母是什么,这两个测试中的一个都是正确的。如果选择a
,则$letter!=b
。如果选择b
,则$letter!=a
。如果选择任何其他角色,则这两个都是真的
您想要的是&&
:
[[ $letter != a && $letter != b && $letter != c && $letter !=d ]] && { echo exiting; exit 1; }.
或者使用=
/=
并在测试后使用|
[[ $letter = a || $letter = b || $letter = c || $letter = d ]] || { echo exiting; exit 1; }
(在这两种情况下,最好使用显式的if
语句,而不是使用&
或|
:
if [[ $letter != a && $letter != b ... ]]; then
echo exiting >&2 # use standard error, not standard output
exit 1
fi
if ! [[ $letter = a || $letter = b ... ]]; then
echo exiting >&2 # use standard error, not standard output
exit 1
fi
)
不过,更简单的方法是使用case
语句:
case $letter in
a|b|c|d) : ;; # do nothing
*) echo exiting
exit 1
;;
esac
复制标志的上下文:…注意,特别是进入bash。即使在第一个代码示例中,可能也应该执行
&&&{echo exiting;exit 1;}
操作——这样,即使echo
失败,我们仍然可以到达exit
。感谢chepner的回答和Charles Duffy的链接,这非常有用。