Comment demander un oui ou un non à bash?

Comment puis-je poser une question de type oui / non dans Bash?

Je pose la question … echo "Do you like pie?"

Et recevez la réponse … read pie

Comment est-ce que je fais quelque chose si la réponse est yes , ou commence par y (donc oui et oui, etc., fonctionnera aussi).

J’aime utiliser la fonction suivante:

 function yes_or_no { while true; do read -p "$* [y/n]: " yn case $yn in [Yy]*) return 0 ;; [Nn]*) echo "Aborted" ; return 1 ;; esac done } 

Donc, dans votre script, vous pouvez utiliser comme ceci:

 yes_or_no "$message" && do_something 

Si l’utilisateur appuie sur une touche autre que [YYNN], le message sera répété.

Cela fonctionne aussi:

 read -e -p "Do you like pie? " choice [[ "$choice" == [Yy]* ]] && echo "doing something" || echo "that was a no" 

Le motif commençant par Y ou y sera considéré comme yes .

Cela marche:

 echo "Do you like pie?" read pie if [[ $pie == y* ]]; then echo "You do! Awesome." else echo "I don't like it much, either." fi 

[[ $pie == y* ]] teste pour voir la variable $pie commence par y.

N’hésitez pas à améliorer cela si vous le souhaitez.

Contrairement aux autres réponses, cette fonction vous permet de définir une valeur par défaut:

 function askYesNo { QUESTION=$1 DEFAULT=$2 if [ "$DEFAULT" = true ]; then OPTIONS="[Y/n]" DEFAULT="y" else OPTIONS="[y/N]" DEFAULT="n" fi read -p "$QUESTION $OPTIONS " -n 1 -s -r INPUT INPUT=${INPUT:-${DEFAULT}} echo ${INPUT} if [[ "$INPUT" =~ ^[yY]$ ]]; then ANSWER=true else ANSWER=false fi } askYesNo "Do it?" true DOIT=$ANSWER if [ "$DOIT" = true ]; then < do some stuff > fi 

Sur la ligne de commande, vous verriez

 Do it? [Y/n] y 

J’aime le mannequin de Jahid . Voici une légère simplification:

 [[ "$(read -e -p 'Continue? [y/N]> '; echo $REPLY)" == [Yy]* ]] 

Voici quelques tests:

 $ [[ "$(read -e -p 'Continue? [y/N]> '; echo $REPLY)" == [Yy]* ]] && echo Continuing || echo Stopping Continue? [y/N]> yes Continuing $ for test_ssortingng in y Y yes YES no ''; do echo "Test Ssortingng: '$test_ssortingng'"; echo $test_ssortingng | [[ "$(read -e -p 'Continue? [y/N]>'; echo $REPLY)" == [Yy]* ]] && echo Continuing || echo Stopping; done Test Ssortingng: 'y' Continuing Test Ssortingng: 'Y' Continuing Test Ssortingng: 'yes' Continuing Test Ssortingng: 'YES' Continuing Test Ssortingng: 'no' Stopping Test Ssortingng: '' Stopping