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

Linux 如何在Bash脚本条件表达式中测试A是否不等于B或C,linux,bash,shell,scripting,centos,Linux,Bash,Shell,Scripting,Centos,我希望用户被迫输入正确的变量,以完成脚本 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 reboo

我希望用户被迫输入正确的变量,以完成脚本

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)和(A C))

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

case $var_hadoop in
   y) : handle "y" here ;;
   n) : handle "n" here ;;
   *) echo 'Either enter "y" or "n"' ;;
esac
也就是说,在bash或其他shell中,通过对POSIX的ksh扩展,可以实现以下功能:

if ! [[ $var_hadoop = [yn] ]]; then
  echo 'Either enter "y" or "n"'
fi
…并且在所有POSIX shell中都可以执行以下操作:

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

[$var_hadoop=“y”]
有点傻——它将需要引用的内容(变量扩展)保留为不带引号,并在不重要的地方引用(字符串文字
y
)。re:
![$var_hadoop=“y”]||!顺便说一句,它在任何语言中的行为都是一样的,因为即使当
var\u hadoop=y
时,它也不等于
n
,当它是
n
时,它也不等于
y
,所以你总是至少有一个分支为false(或者在否定之后为true)。使用既不是
y
也不是
n
的东西,两个分支都是false(或者,否定后为true),但它会将流控制发送到完全相同的路径上。其他如此长的胡子:我们这里不是有一个关于优先级和布尔逻辑误解的一般问题吗?(顺便说一句,回到引用这个话题——在这一点上做了很好的自动分析;我强烈建议使用它。如果你不想将内容发送到异地,你可以下载并编译源代码在本地运行)。答案很好,但是首先测试第二个答案我得到:shell.sh:4:shell.sh:[[:不found@AirCombat,那么您的shell就不是真正的bash。如果您想要的答案与
!/bin/sh
一起使用,那么就不要使用
!/bin/bash
(或者
sh yourscript
,而不是
bash yourscript
),您需要适当地标记您的问题。我错误地使用sh而不是bash已经有一段令人尴尬的时间了(在顶部说明bash,但使用sh)。事实证明,
/bin/sh
有时由bash实现(取决于您的操作系统或发行版),这进一步混淆了问题…但即使是这样,它也倾向于在POSIX兼容模式下运行bash,因此它没有启用所有扩展名。需要更多的引号。如果您有一个名为
xy
xn
的文件,那么在运行此文件时您的当前目录是什么?正则表达式将永远无法进入
expr
,因为它可以作为全局展开。
#!/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