猫测试.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"
...
如果$value
是m
,则它不等于y
,也不等于n
,因此计算结果为 (true或者if
true),即为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" ]]
等,因为[[
它很特殊,并且是空格不会导致拆分的少数情况之一。)
也可以看看: