或bash测试中的逻辑运算符

时间:2018-04-08 17:24:28

标签: bash logical-operators

测试似乎无法正常工作。为什么? 我需要一个脚本,它接受第一个参数,检查它是什么字母并完成工作。如果字母是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

1 个答案:

答案 0 :(得分:4)

让我们举一个更简单的例子:[[ $letter != a || $letter != b ]]无论letter是什么,这两个测试中的一个都是真的。如果您选择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