Тестирование на неравенство не работает - PullRequest
0 голосов
/ 10 июня 2018
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 не выполняется правильно?

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Если мы внимательно посмотрим на приглашение "Пожалуйста, введите y | Y или n | N " , то отсутствует третий случай, который обрабатывает неверный ввод.Вместе с ответом @ cdarke это приводит, например, к следующему короткому условию:

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
0 голосов
/ 10 июня 2018

Другой пример, я гарантирую, что мы не продолжим, пока мы не получим конкретно y / n / q в качестве входных данных.использование -p -n1 избавляет от необходимости нажимать ввод.В итоге: оператор case, чтение одной клавиши, проверка нижнего регистра и т. Д. В этом примере допускается да / нет или выход.

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
0 голосов
/ 10 июня 2018

Это:

[[ "$CONFIRM" != "Y" ]] || [[ "$CONFIRM" != "y" ]]

означает "$CONFIRM не Y или $CONFIRM не y".Всегда гарантируется, что истина будет:

  • , если $CONFIRM равен Y, тогда это не y, поэтому второй параметр равен
  • , если $CONFIRMy, тогда это не Y, поэтому первая опция - это правда
  • , если $CONFIRM - это что-то еще, тогда обе опции верны

Чтобы это исправить, вынужно использовать && ("и") вместо || ("или"):

[[ "$CONFIRM" != Y ]] && [[ "$CONFIRM" != y ]]

, что по законам Де Моргана эквивалентно этому:

! { [[ "$CONFIRM" = Y ]] || [[ "$CONFIRM" = y ]] ; }
...