18/10/2024

Bash

Script Bash – Comment créer un menu interactif ?

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" :

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.

III. Création du menu interactif avec select

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.

IV. Ajouter des couleurs au menu

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.

Script Bash - Menu interactif avec 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 !

V. Créer un menu interactif avec read

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.

Menu interactif script bash avec read

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.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

1 commentaire sur “Script Bash – Comment créer un menu interactif ?

  • 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.

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.