如何在 Bash 脚本条件表达式中测试 A 是否不等于 B 或 C

How to test if A is not equal to B or C in Bash Script conditional expression

我希望强制用户输入正确的变量以完成脚本。

var_hadoop="y"

read -p "Install Hadoop after reboot? [y/n]: " var_hadoop

while  ! [ $var_hadoop = "y" ] || ! [ $var_hadoop = "n" ]; do
        echo "Only enter either \"y\" or \"n\"."
        read -p "Install Hadoop after reboot? [y/n]: " var_hadoop
done

我尝试了多种不同的布局并四处搜索,但没有找到任何内容:

!((A == B) or (A == C))

((A <> B) and (A <> C))

传统的、惯用的、POSIX 兼容的方法是使用 case 语句:

case $var_hadoop in
   y) : handle "y" here ;;
   n) : handle "n" here ;;
   *) echo 'Either enter "y" or "n"' ;;
esac

也就是说,以下内容适用于 bash 或其他 ksh 扩展为 POSIX 的 shell:

if ! [[ $var_hadoop = [yn] ]]; then
  echo 'Either enter "y" or "n"'
fi

...以下适用于所有 POSIX 外壳:

if ! { [ "$var_hadoop" = y ] || [ "$var_hadoop" = n ]; }; then
  echo 'Either enter "y" or "n"'
fi

以 POSIX 兼容的方式,您还可以使用 expr string : regex 测试来强制执行 y/n 答案:

#!/bin/sh

printf "Install Hadoop after reboot? [y/n]: "
read var_hadoop

while [ $(expr "x$var_hadoop" : "x[yn]") -eq 0 ]; do
    printf "Only enter either \"y\" or \"n\".\n"
    printf "Install Hadoop after reboot? [y/n]: "
    read var_hadoop
done