Procesando una respuesta Sí / No del usuario Bash

11

Esto muy bien puede ser estupidez de mi parte. Me gustaría aceptar respuestas Sí / No, Verdadero / Falso dentro de mi 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

Aquí hay algunos resultados de muestra:

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

Ahora el stumper. ¿Por qué está [[ "${OPTARG^^}" == "N" ]]volviendo verdadero para cualquier cadena?

./test.sh Sí

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline
i_grok
fuente
¿Qué pasa si cita esto? OPTARG = "$ {ARGUMENTO: 0: 1}"
mikeserv
1
No importa. Ricitos de Oro tiene razón.
mikeserv

Respuestas:

10

Esta:

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

Coincidirá con cualquier cadena, a menos que sean solo dígitos. Utilizar:

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

En lugar.

encerrada dorada
fuente
8

Aunque el problema en su código ha sido bien explicado por Ricitos de Oro , no puedo resistirme a decir que su código es innecesariamente largo. Podrías simplificarlo mucho.

Lo siguiente es equivalente a su código deseado:

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

Es posible que también desee consultar las Construcciones condicionales en el manual .

devnull
fuente
Gracias devnull. ¡Definitivamente usaré este truco en futuros guiones! No sabía si debía aceptar su respuesta, pero creo que las distinciones en la respuesta de Ricitos de Oro pueden ser útiles para otros.
i_grok
@i_grok Mencioné en mi respuesta que la respuesta de Ricitos de Oro apunta al problema. Simplemente presenté un enfoque alternativo que parecía más legible . Es bueno ver surgir múltiples enfoques para resolver un problema. Respecto de qué respuesta se acepta es un asunto relativamente trivial.
devnull
6

También puedes usar 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
Rahul Patil
fuente