Обработка ответа Да / Нет от пользователя Bash

11

Это очень хорошо, может быть глупость с моей стороны. Я хотел бы принять ответы Да / Нет, Правда / Ложь в моем скрипте Bash:

test.sh

#!/bin/bash

ARGUMENT=$1

echo User passed in $ARGUMENT

OPTARG=${ARGUMENT:0:1}

if [[ "$OPTARG" -eq 0 ]] || [[ "${OPTARG^^}" == "N" ]]; then
    echo Decline
elif [[ "$OPTARG" -eq 1 ]] || [[ "${OPTARG^^}" == "Y" ]]; then
    echo Accept
else
    echo Invalid argument
fi

Вот некоторые примеры результатов:

./test.sh 0

User passed in 0
Decline

./test.sh 1

User passed in 1
Accept

./test.sh 2

User passed in 2
Invalid argument

./test.sh Нет

User passed in No
Decline

Теперь тупик. Почему [[ "${OPTARG^^}" == "N" ]]возвращается true для любой строки !?

./test.sh Да

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline
i_grok
источник
что произойдет, если вы процитируете это? OPTARG = "$ {ARGUMENT: 0: 1}"
mikeserv
1
Ничего. Златовласка права.
mikeserv

Ответы:

10

Эта:

if [[ "$OPTARG" -eq 0 ]] 

Будет соответствовать любой строке, если только это не цифры. Использование:

if [[ "$OPTARG" == "0" ]] 

Вместо.

лютик золотистый
источник
8

Несмотря на то, что проблема в коде была хорошо объяснено с помощью Златовласки , я не могу сопротивляться сказать , что ваш код без необходимости долго. Вы могли бы сильно упростить это.

Следующее эквивалентно вашему желаемому коду:

echo User passed in $1
if [[ "$1" == [nN0]* ]]; then      # First argument starts with either n, N, or 0
    echo Decline
elif [[ "$1" == [yY1]* ]]; then    # First argument starts with either y, Y, or 1
    echo Accept
else
    echo Invalid argument
fi

Вы можете также обратиться к Условным конструкциям в руководстве .

devnull
источник
Спасибо, девнул. Я обязательно буду использовать этот трюк в будущих сценариях! Я разрывался относительно того, должен ли я принять ваш ответ, но я думаю, что различия в ответе златовласки могут быть полезны для других.
i_grok
@i_grok Я упомянул в своем ответе, что ответ Златовласки указывает на проблему. Я просто представил альтернативный подход, который казался более читабельным . Приятно видеть несколько подходов к решению проблемы. Относительно того, какой ответ принят, является относительно тривиальным делом.
devnull
6

Также вы можете использовать case

read -p 'Do you want to Continue (yes/no?): ' 
case $REPLY in
       [yY]|[yY][eE][sS]) echo Accept             ;;
           [nN]|[nN][oO]) echo Decline            ;;
                       *) echo "Invalid argument" ;;
esac
Рахул Патил
источник