不平等测试不起作用
Testing for Inequality Doesn't Work
CONFIRM=""
echo "Do you want to backup your home directory? Please enter y|Y or n|N"
read CONFIRM;
if [[ "$CONFIRM" != "Y" ]] || [[ "$CONFIRM" != "y" ]]; then
echo "The backup will not run. Aborting now..."
else
echo "The backup will run now. Backing up to $DEST"
# more code
fi
每当我输入"y"或"Y"时,应该执行else
下的条件。相反,无论我输入什么,if
下的条件都会执行。我已经尝试了方括号和我能想到的引用的多种组合,但没有任何效果。为什么 else
分支没有正确执行?
这个:
[[ "$CONFIRM" != "Y" ]] || [[ "$CONFIRM" != "y" ]]
表示“$CONFIRM
不是 Y
或 $CONFIRM
不是 y
”。这始终保证是真的:
- 如果
$CONFIRM
是Y
,则不是y
,所以第二个选项为真
- 如果
$CONFIRM
是y
,则不是Y
,所以第一个选项为真
- 如果
$CONFIRM
是其他任何选项,则两个选项都为真
要解决此问题,您需要使用 &&
("and") 而不是 ||
("or"):
[[ "$CONFIRM" != Y ]] && [[ "$CONFIRM" != y ]]
De Morgan's laws 相当于:
! { [[ "$CONFIRM" = Y ]] || [[ "$CONFIRM" = y ]] ; }
如果我们仔细查看提示 "Please enter y | Y or n | N",那么会缺少第三种情况,即处理无效输入。连同 的回答,这导致例如在以下短条件下:
CONFIRM=""
echo "Do you want to backup your home directory? Please enter y|Y or n|N"
read CONFIRM;
if [[ "$CONFIRM" = [Yy] ]]; then
echo "The backup will run now. Backing up to $DEST"
# more code
elif [[ "$CONFIRM" = [Nn] ]]; then
echo "The backup will not run. Aborting now..."
else
echo "Wrong Input. Please enter y|Y or n|N."
fi
另一个例子,我确保在我们明确 y/n/q 作为输入之前我们不会继续。使用 -p -n1 无需按回车键。总结:一个 case 语句,读取一个按键,小写检查等......这个例子允许 yes/no 或退出。
typeset confirm=''
while true; do
read -p "Select (y/n/q) ?" -n1 confirm
case ${confirm,,} in
y|n|q) break;;
*) echo "Answer y for yes / n for no or q for quit.";;
esac
done
echo -e "\nAnswer = $confirm" ;sleep 2
if [[ "${confirm,,}" == "q" ]] ; then
echo "OK Quitting.."
exit 0
fi
if [[ "${confirm,,}" == "y" ]] ; then
echo "Continuing ..."
else
echo "No? Do something else etc.. "
fi
CONFIRM=""
echo "Do you want to backup your home directory? Please enter y|Y or n|N"
read CONFIRM;
if [[ "$CONFIRM" != "Y" ]] || [[ "$CONFIRM" != "y" ]]; then
echo "The backup will not run. Aborting now..."
else
echo "The backup will run now. Backing up to $DEST"
# more code
fi
每当我输入"y"或"Y"时,应该执行else
下的条件。相反,无论我输入什么,if
下的条件都会执行。我已经尝试了方括号和我能想到的引用的多种组合,但没有任何效果。为什么 else
分支没有正确执行?
这个:
[[ "$CONFIRM" != "Y" ]] || [[ "$CONFIRM" != "y" ]]
表示“$CONFIRM
不是 Y
或 $CONFIRM
不是 y
”。这始终保证是真的:
- 如果
$CONFIRM
是Y
,则不是y
,所以第二个选项为真 - 如果
$CONFIRM
是y
,则不是Y
,所以第一个选项为真 - 如果
$CONFIRM
是其他任何选项,则两个选项都为真
要解决此问题,您需要使用 &&
("and") 而不是 ||
("or"):
[[ "$CONFIRM" != Y ]] && [[ "$CONFIRM" != y ]]
De Morgan's laws 相当于:
! { [[ "$CONFIRM" = Y ]] || [[ "$CONFIRM" = y ]] ; }
如果我们仔细查看提示 "Please enter y | Y or n | N",那么会缺少第三种情况,即处理无效输入。连同
CONFIRM=""
echo "Do you want to backup your home directory? Please enter y|Y or n|N"
read CONFIRM;
if [[ "$CONFIRM" = [Yy] ]]; then
echo "The backup will run now. Backing up to $DEST"
# more code
elif [[ "$CONFIRM" = [Nn] ]]; then
echo "The backup will not run. Aborting now..."
else
echo "Wrong Input. Please enter y|Y or n|N."
fi
另一个例子,我确保在我们明确 y/n/q 作为输入之前我们不会继续。使用 -p -n1 无需按回车键。总结:一个 case 语句,读取一个按键,小写检查等......这个例子允许 yes/no 或退出。
typeset confirm=''
while true; do
read -p "Select (y/n/q) ?" -n1 confirm
case ${confirm,,} in
y|n|q) break;;
*) echo "Answer y for yes / n for no or q for quit.";;
esac
done
echo -e "\nAnswer = $confirm" ;sleep 2
if [[ "${confirm,,}" == "q" ]] ; then
echo "OK Quitting.."
exit 0
fi
if [[ "${confirm,,}" == "y" ]] ; then
echo "Continuing ..."
else
echo "No? Do something else etc.. "
fi