bash测试中的OR逻辑运算符

bash测试中的OR逻辑运算符,bash,logical-operators,Bash,Logical Operators,这项测试似乎不能正常进行。为什么? 我需要一个脚本,它接受第一个参数,检查它是哪个字母,并完成这项工作。如果字母是a、b、c或d,则退出,否则为右 letter=$1 [[ $letter != a || $let

这项测试似乎不能正常进行。为什么? 我需要一个脚本,它接受第一个参数,检查它是哪个字母,并完成这项工作。如果字母是a、b、c或d,则退出,否则为右

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的链接,这非常有用。