Обробка відповіді так / ні від користувача 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

що станеться, якщо ти це цитуєш? 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.