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
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
# 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
}
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