Elaborazione di una risposta Sì / No dall'utente Bash


11

Questo molto bene potrebbe essere stupidità da parte mia. Vorrei accettare risposte Sì / No, Vero / Falso nel mio script 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

Ecco alcuni risultati di esempio:

./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 No

User passed in No
Decline

Ora lo stumper. Perché sta [[ "${OPTARG^^}" == "N" ]]tornando vero per qualsiasi stringa !?

./test.sh Sì

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline

cosa succede se lo citi? OPTARG = "$ {ARGUMENT: 0: 1}"
mikeserv

1
Non importa. Goldilocks ha ragione.
Mikeserv,

Risposte:


10

Questo:

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

Corrisponderà a qualsiasi stringa, a meno che non siano solo cifre. Uso:

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

Anziché.


8

Sebbene il problema nel tuo codice sia stato ben spiegato dai goldilock , non posso resistere nel dire che il tuo codice è inutilmente lungo. Potresti semplificarlo molto.

Quanto segue equivale al codice desiderato:

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

Potresti anche fare riferimento a Costrutti condizionali nel manuale .


Grazie devnull. Userò sicuramente questo trucco negli script futuri! Sono stato strappato sul fatto che dovrei accettare la tua risposta, ma penso che le distinzioni nella risposta dei riccioli d'oro possano essere utili per gli altri.
i_grok,

@i_grok Ho menzionato nella mia risposta che la risposta di riccioli rossi indica il problema. Ho semplicemente presentato un approccio alternativo che sembrava più leggibile . È bello vedere emergere più approcci per risolvere un problema. Per quanto riguarda quale risposta è accettata è un affare relativamente banale.
Devnull

6

Inoltre puoi usare 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.