Traitement d'une réponse Oui / Non de l'utilisateur Bash


11

Cela peut très bien être de la stupidité de ma part. Je souhaite accepter les réponses Oui / Non, Vrai / Faux dans mon 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

Voici quelques exemples de résultats:

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

User passed in No
Decline

Maintenant, le stumper. Pourquoi [[ "${OPTARG^^}" == "N" ]]retourne vrai pour n'importe quelle chaîne!?

./test.sh Oui

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline

que se passe-t-il si vous citez ceci? OPTARG = "$ {ARGUMENT: 0: 1}"
mikeserv

1
Ça ne fait rien. Goldilocks a raison.
mikeserv

Réponses:


10

Cette:

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

Correspondra à n'importe quelle chaîne, sauf s'il ne s'agit que de chiffres. Utilisation:

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

Au lieu.


8

Bien que le problème dans votre code ait été bien expliqué par goldilocks , je ne peux m'empêcher de dire que votre code est inutilement long. Vous pourriez le simplifier beaucoup.

Ce qui suit est équivalent à votre code souhaité:

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

Vous pouvez également vous référer aux constructions conditionnelles dans le manuel .


Merci, devnull. Je vais certainement utiliser cette astuce dans les futurs scripts! J'étais déchiré quant à savoir si je devais accepter votre réponse, mais je pense que les distinctions dans la réponse de goldilocks peuvent être utiles pour les autres.
i_grok

@i_grok J'ai mentionné dans ma réponse que la réponse de goldilocks pointe vers le problème. J'ai simplement présenté une approche alternative qui semblait plus lisible . Il est bon de voir apparaître plusieurs approches pour résoudre un problème. La question de savoir quelle réponse est acceptée est une affaire relativement banale.
devnull

6

Vous pouvez également utiliser 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.