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