Script Bash – Comment créer un menu interactif ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons apprendre à créer un menu interactif en Bash en utilisant l'instruction "select", mais aussi "read". L'instruction "select" est idéale pour ce cas d'usage, car elle facilite la sélection d'options par l'utilisateur.
Nous allons illustrer cette méthode par la création d'un menu permettant à l'utilisateur de choisir d'afficher différentes informations au sujet de la machine locale : la version du système, l'espace disque, la configuration IP et la date du dernier redémarrage de la machine. Pour cette démonstration, Ubuntu via WSL est utilisé, mais il suffit de disposer de Bash.
Pour rappel, voici le lien vers notre introduction au Bash, ainsi que le lien vers l'article sur la saisie utilisateur avec "read" :
- Introduction au Script Bash sous Linux (et en vidéo sur YouTube)
- Script Bash : la saisie utilisateur avec read
II. Rappel sur la structure de base d'un script Bash
Avant de plonger dans la création du menu interactif, revoyons la structure de base d'un script Bash. Un script Bash commence par le shebang qui indique que le script doit être exécuté avec l'interpréteur Bash. Ensuite, nous ajoutons nos instructions à exécuter.
Voici le contenu d'un fichier nommé "script.sh" :
#!/bin/bash
# Ecrire le message "Hello World" dans la console
echo "Hello World !"
Ensuite, ce fichier doit être enregistré et il convient de lui accorder les permissions d'exécution.
chmod +x script.sh
Une fois que c'est fait, nous pouvons l'exécuter en exécutant cette commande :
./script.sh
Ce rappel étant terminé, passons à la création d'un menu interactif.
L'instruction "select" permet de présenter un menu d'options à l'utilisateur et de "capturer" son choix, c'est-à-dire l'option qu'il a choisie.
Lors de l'utilisation de "select" pour créer un menu interactif, Bash affiche une liste numérotée avec les options disponibles. Après avoir affiché les options, il utilise la valeur de "PS3" comme invite pour demander à l'utilisateur de faire une sélection.
La variable "PS3" utilisée dans l'exemple présenté ci-dessous, est une variable spéciale utilisée dans les scripts Bash en conjonction avec l'instruction "select". Sur le même esprit que "read", elle sert à définir le prompt (l'invite) qui est affiché à l'utilisateur pour lui indiquer qu'il doit faire un choix parmi les options présentées.
Voici le contenu du fichier "menu1.sh" :
#!/bin/bash
PS3="Quelle tâche souhaitez-vous exécuter ? "
options=("Voir la version du système" "Voir l'espace disque" "Voir la configuration IP" "Voir la date du dernier redémarrage" "Quitter")
select choix in "${options[@]}"; do
case $REPLY in
1)
echo "Version du système :"
uname -a
;;
2)
echo "Espace disque :"
df -h
;;
3)
echo "Configuration IP :"
ip a
;;
4)
echo "Date du dernier redémarrage :"
who -b
;;
5)
echo "Exit"
break
;;
*)
echo "Option invalide, veuillez réessayer !"
;;
esac
done
Dans cet exemple, nous utilisons l'instruction "select" pour afficher cinq options différentes : Voir la version du système, Voir l'espace disque, Voir la configuration IP, Voir la date du dernier redémarrage de la machine, et quitter le menu. L'utilisateur est invité à entrer un numéro correspondant à l'option souhaitée, afin d'exécuter la tâche correspondante. La variable spéciale "$REPLY" contient le numéro de l'option sélectionnée, ce qui nous permet d'exécuter les actions appropriées.
Voici quelques précisions sur les différentes commandes Bash utilisées pour afficher les informations demandées :
- Voir la version du système : "uname -a" affiche des informations détaillées sur le système d'exploitation
- Voir espace disque : "df -h" affiche l'utilisation de l'espace disque en format lisible par l'homme.
- Voir configuration IP : "ip a" affiche la configuration réseau actuelle, y compris les adresses IP pour chaque interface réseau.
- Voir la date du dernier redémarrage : "who -b" affiche la date et l'heure du dernier redémarrage du système.
Découvrons ce script à l'usage... Commençons par l'exécuter :
./menu1.sh
Nous obtenons le résultat ci-dessous. Nous avons bien une liste de choix numérotée, où chacune de nos options est présente.
Désormais, si nous faisons un choix et que nous appuyons sur Entrée, l'instruction correspondante est bien exécutée. Si l'option n'est pas reconnue, une erreur est retournée et nous sommes invités à faire un nouveau choix. Enfin, si le choix "5" est fait, nous quittons le script.
Plutôt pratique, n'est-ce pas ? Voyons comment améliorer l'esthétique de ce menu en ajoutant un peu de couleurs aux réponses retournées.
Pour ajouter de la couleur à votre menu interactif en Bash, vous pouvez utiliser les codes d'échappement ANSI. Ces codes permettent de changer la couleur du texte dans le terminal, et donc de changer la couleur du texte retourné par notre script dans la console.
Nous allons définir un ensemble de variables correspondantes à nos couleurs, puis nous appellerons ces variables dans le script lorsque nous aurons besoin de changer la couleur du texte. Il y a aussi une variable de réinitialisation de la couleur (appelée "NC" dans cet exemple) pour marquer la fin de la colorisation du texte.
Ceci implique de modifier le code écrit précédemment pour envelopper chaque réponse de notre menu avec les variables de couleur appropriées. Nous ne pouvons pas jouer directement sur les couleurs des options dans le cadre du select.
Voici le contenu du fichier "menu2.sh" :
#!/bin/bash
# Définir les couleurs avec des variables
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # Aucune couleur
PS3="Quelle tâche souhaitez-vous exécuter ? "
options=("Voir la version du système" "Voir l'espace disque" "Voir la configuration IP" "Voir la date du dernier redémarrage" "Quitter")
select choix in "${options[@]}"; do
case $REPLY in
1)
echo -e "${GREEN}Version du système :${NC}"
uname -a
;;
2)
echo -e "${GREEN}Espace disque :${NC}"
df -h
;;
3)
echo -e "${GREEN}Configuration IP :${NC}"
ip a
;;
4)
echo -e "${GREEN}Date du dernier redémarrage :${NC}"
who -b
;;
5)
echo -e "${YELLOW}Exit${NC}"
break
;;
*)
echo -e "${RED}Option invalide, veuillez réessayer !${NC}"
;;
esac
done
Ce nouveau script fonctionne de la même façon que la précédente version, à la différence que désormais, nous avons des couleurs.
Pour que ce soit bien clair, analysons la syntaxe d'une couleur. Par exemple :
RED='\033[0;31m'
Cette écriture correspond à une séquence d'échappement utilisée dans les terminaux compatibles avec ANSI pour changer la couleur du texte.
- \033 : c'est l'octet d'échappement en notation octale qui indique le début d'une séquence d'échappement ANSI.
- [0;31m : c'est la séquence de commande qui suit l'octet d'échappement, où "0" réinitialise les attributs de texte (par exemple, pas de gras, pas de souligné, etc.) et "31" définit la couleur, ici cela correspond au rouge.
La séquence complète change donc la couleur du texte en rouge !
Pour finir, nous allons voir une autre méthode basée sur l'utilisation de "read" à la place de "select". Lors de l'utilisation de "read", le script ne génère pas une liste numérotée avec les options de façon automatique.
C'est à nous de créer cette liste pour définir le texte du menu, ce qui offre aussi plus de liberté : à la place de choix avec des numéros, nous pourrions utiliser des lettres (à partir du moment où les lettres sont définies dans le "case" et que le texte du menu est adapté pour garder une bonne cohérence de l'ensemble).
Puisque nous utilisons la commande "echo" pour créer ce menu, nous pouvons aussi définir les couleurs du texte comme bon nous semble. Enfin, une boucle while est utilisée pour revenir à la sélectionner d'une tâche de façon systématique, jusqu'à ce que l'utilisateur décide de quitter.
Voici le contenu du fichier "menu3.sh" :
#!/bin/bash
# Définir les couleurs avec des variables
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # Aucune couleur
while true; do
echo -e "${YELLOW}Menu :"
echo -e "${GREEN}1) Voir la version du système"
echo -e "2) Voir espace disque"
echo -e "3) Voir configuration IP"
echo -e "4) Voir la date du dernier redémarrage"
echo -e "5) Quitter"
echo -e "${YELLOW}Choisissez une option : ${NC}"
read choix
case $choix in
1)
echo -e "${GREEN}Version du système :${NC}"
uname -a
;;
2)
echo -e "${GREEN}Espace disque :${NC}"
df -h
;;
3)
echo -e "${GREEN}Configuration IP :${NC}"
ip a
;;
4)
echo -e "${GREEN}Date du dernier redémarrage :${NC}"
who -b
;;
5)
echo -e "${YELLOW}Exit${NC}"
break
;;
*)
echo -e "${RED}Option invalide, veuillez réessayer !${NC}"
;;
esac
done
Lors de l'exécution, nous voyons que les couleurs sont bien prises en charge. Nous obtenons un comportement similaire à la précédente méthode.
VI. Conclusion
Voilà, nous avons appris à créer un menu interactif en Bash en utilisant l'instruction "select", mais aussi le "read", afin d'afficher des informations basiques à propos de la machine locale. Désormais, à vous de jouer et de vous inspirer de cet exemple pour créer le menu interactif de votre choix ! Ce sera l'occasion de rendre certains scripts beaucoup plus conviviaux, notamment lorsqu'ils sont utilisés comme des outils de façon interactive.
Merci pour l’article.
Personnellement j’ai une préférence pour Whiptail ou Dialog selon les distributions.
Cela demande une dépendance mais l’un ou l’autre est en général disponible par défaut.
Le principal avantage est de pouvoir naviguer avec les touches fléchées et la bar d’espace pour sélectionner les options.
Vive la flemme 😉
Salutation.