Shell脚本:if中不等于的多个或运算符条件

Shell脚本:if中不等于的多个或运算符条件

猫测试.sh

read value
if [ $value != "y" ] || [ $value != "n" ]
then
echo "invalid"
exit 1
fi 

我尝试在运行时传递值,例如“n”、“m”和“y”。我希望当我通过“m”时脚本退出。但它没有按预期工作。

注意:上面的代码适用于 Bash shell。

我尝试了几种语法但没有成功。

if [ $value != "y" || $value != "n" ]

if [[ $value != "y" ] || [ $value != "n" ]]

if [[ $value != "y" ]] || [[ $value != "n" ]]

if [[ $value != "y" || $value != "n" ]]

有时条件不满足

请帮助解决这个问题

答案1

我希望当我通过“m”时脚本退出。但它没有按预期工作。

好的,所以,你有条件:

if [ $value != "y" ] || [ $value != "n" ]; then
    echo "invalid"
    ...

如果$valuem,则它不等于y,也不等于n,因此计算结果为 (true或者iftrue),即为true,并且执行里面的命令。

如果$value如果y,它等于y,但不等于n,因此计算结果为 (false或者正确),其中是真的,所以里面的命令if又被执行了。

if不会执行内部命令的唯一情况是两个测试都为假的情况——$value需要同时等于y和等于。n

基本上,你想要的是这个

if [ $value = "y" ] || [ $value = "n" ]; then
    echo ok
else
    echo invalid
fi

但是没有无用的“ok”分支,所以条件颠倒了:

if ! ( [ $value = "y" ] || [ $value = "n" ] ); then
    echo invalid
fi

现在,(A或者B) 不是 (不是A或不B),但是(不是A 不是B),这就是你的情况需要说的。

另外,您想要引用变量扩展,因为否则内容中的空格$value会扰乱命令的解释方式,因此:

if [ "$value" != "y" ] && [ "$value" != "n" ]; then
    echo invalid
fi

(或使用[[ $value != "y" ]]等,因为[[它很特殊,并且是空格不会导致拆分的少数情况之一。)

也可以看看:

相关内容