Une place pour une véritable innovation. Partagez vos propres utilitaires créés avec la communauté Manjaro.
Questions et discussions sur la programmation et le codage.
Répondre

[bash] faire une demande oui/non interactive

#1Messageil y a 6 ans

:bjr: bonjour

Aligner 10 commandes dans un script bash c'est bien, mais le rendre interactif avec l'utilisateur est mieux.

Nous allons donc voir la célèbre question Oui/Non et détailler une des solutions qui sera la plus souple/simple pour nous.
  • Nous risquons d'avoir plusieurs demande et de faire cette demande dans divers scripts donc il est préférable d'écrire une fonction la plus générique possible

    ask_yesno "Continuer (O/n)" "O"
    ask_yesno est le nom de la fonction - une fonction peut-être vue comme une commande bash mais accessible uniquement dans notre script
  • Elle prend 2 paramètres:
    - le texte à afficher (la question)
    - optionnel, la réponse par défaut si l'utilisateur utilise uniquement la touche "retour"
    Cela nous apporte un peu de souplesse pour pouvoir réutiliser dans 90% des cas notre fonction.
  • Notre fonction ne va retourner qu'un code vrai/faux en fonction de la réponse par défaut
    - vrai (0) si la réponse est la valeur par défaut
    - faux (1) si la réponse est différente de la valeur par défaut
Il est aussi possible d'écrire une fonction bloquante qui n'accepte que 2 réponses


Une telle fonction s'utilise de cette façon dans notre code :

if ask_yesno "afficher bonjour (O/n)" "O"; then
    echo "ok: bonjour"
else
    echo "réponse négative"
fi

if ask_yesno "afficher bonjour (o/N)" ; then
    echo "réponse négative"
else
    echo "ok: bonjour"
fi
Maintenant le détail de notre fonction réutilisable presque à l'infini :

# demande par y/n
# par défaut réponse = No
ask_yesno()
{
    declare txt="${1:-oui / Non (o/N)}"
    declare default="${2:-N}"
    declare response
    
    read -p "$txt ? " response
    response=${response:0:1}
    [[ -z "$response" ]] && response=${default}
    [[ "${response^^}" == "${default^^}" ]] && return 0
    return 1
}
ligne 2 (de la fonction)
Nous pouvons voir que si le deuxième paramètre est absent, alors la valeur par défaut est N, ceci n'est qu'un choix tout à fait personnel. default="${2:-N}"
ligne 6
Nous testons uniquement le premier caractère !! response=${response:0:1} donc notre fonction est relativement accommodante, nous avons un oui avec "O", "Oui" mais aussi "ou"
ligne 8
Nous forçons la réponse utilisateur et la valeur par défaut en majuscule pour une plus grande souplesse pour l'usager et moins de code pour nous si "${response^^}" == "${default^^}" alors

----------------

Nous avons un système qui peut-être multilangue (fichiers .mo .po) :

ask_yes=$(gettext 'Y')
ask_no=$(gettext 'N')

if ask_yesno "$(gettext "print Hello (Y/n)")" "$ask_yes"; then
    echo "$(gettext 'Hello you')"
fi

[bash] faire une demande oui/non interactive

#2Messageil y a 6 ans

:salut: Voilà un tuto qui tombe à pic (pour moi):merci:
Répondre