不平等测试不起作用

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”。这始终保证是真的:

  • 如果$CONFIRMY,则不是y,所以第二个选项为真
  • 如果$CONFIRMy,则不是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