bash 测试中的 OR 逻辑运算符

OR logical operator in bash test

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

letter=                                                                                                                                             


[[ $letter != a || $letter != b || $letter != c || $letter != d ]] && echo exiting && exit 1                                                          


if [[ $letter == a ]]                                                                                                                                 
then                                                                                                                                                  
echo correct                                                                                                                                      
fi

让我们举一个更简单的例子: [[ $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