Comment créer un menu de sélection à l'aide de l'instruction SELECT dans Bash Shell

Comment créer un menu de sélection à l'aide de l'instruction SELECT dans Bash Shell

Nous utilisons tous très souvent des scripts bash pour automatiser les tâches ennuyeuses et répétitives. Parfois, dans nos scripts, nous devons demander
L'utilisateur pour effectuer un ou plusieurs choix de manière interactive: dans ce tutoriel, nous verrons comment utiliser l'instruction Bash Shell Select pour effectuer une telle opération dans très peu de lignes de code.

Dans ce tutoriel, vous apprendrez:

  • Comment utiliser l'instruction BASH SELECT
  • Comment personnaliser l'invite de menu Sélectionner
Comment créer un menu de sélection à l'aide de l'instruction SELECT dans Bash Shell

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution
Logiciel La coquille de bash
Autre Aucune exigence spéciale
Conventions # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier

L'instruction SELECT

Le script est l'une des compétences les plus courantes qu'un administrateur système doit posséder, afin d'automatiser
tâches et les rendre moins sujets à l'erreur. Dans des cas pas trop complexes, le shell est l'outil parfait à utiliser pour le travail. Bash, le Bourne à nouveau Shell, est la coque la plus utilisée dans le monde GNU / Linux. Ce shell fournit le très utile sélectionner déclaration. Son objectif est décrit de la manière suivante:

Sélectionnez des mots dans une liste et exécutez les commandes



La description est assez explicite. L'instruction nous permet de recevoir de manière interactive une entrée d'un utilisateur, de générer une liste numérotée de choix et de l'inciter à en sélectionner un. Voyons comment il est utilisé:

Sélectionnez Nom [en mots…;] DO Commandes; fait

La syntaxe est très similaire à celle d'un traditionnel pour boucle en bash, sauf pour l'utilisation du sélectionner mot-clé. L'instruction SELECT, cependant, fonctionne d'une manière différente. Voyons un exemple. Supposons que nous voulons demander à un utilisateur de sélectionner l'un des fichiers contenus dans un répertoire. Voici ce que nous pourrions écrire:

$ files = "$ (ls -a .) "$ sélectionner le nom de fichier dans $ fichiers; faire écho" $ fichier "; fait 1) fichier1 2) fichier2 3) file3 #?

Expliquons ce que nous avons fait. Tout d'abord, nous avons obtenu une liste de tous les fichiers présents dans le répertoire (dans ce cas le répertoire de travail actuel) en utilisant le LS commander et spécifier le -UN Option (abréviation pour --presque toutes), afin d'exclure le . et à partir de la liste retournée, que nous avons affecté au des dossiers variable.

Nous avons ensuite procédé à l'utilisation du sélectionner déclaration. Ce qui précède est un exemple très basique: nous avons fourni le résultat de l'expansion du déposer variable comme la liste des choix à inclure. Notez que nous avons évité de citer l'expansion $ fichiers exprès, afin d'obtenir division des mots: Lorsqu'une expansion est citée avec des citations doubles division des mots est supprimé, de sorte que les espaces ne sont pas utilisés comme délimiteurs de mots et le résultat de l'expansion est considéré comme un ensemble. Ce n'est pas ce que nous voulons dans ce cas: nous avons besoin que chaque mot soit utilisé comme choix dans le menu généré.



Les mots obtenus à partir de l'expansion de la variable sont imprimés sur le stderr (erreur standard). Chacun est précédé et associé à un nombre, ce que l'utilisateur utilisera pour le référencer. Une fois tous les éléments affichés, l'utilisateur est invité à entrer son choix. Ce qui est affiché est le PS3 invite, qui, par défaut, est défini sur #?.

Que se passe-t-il lorsque l'utilisateur effectue une sélection? Voyons:

$ files = "$ (ls -a .) "$ sélectionner le nom de fichier dans $ fichiers; faire echo" vous avez sélectionné $ nom de fichier "; fait 1) fichier1 2) fichier2 3) file3 #? 1 Vous avez sélectionné Fichier1 #?

Le choix que nous avons fait, 1, est lu dans le stdin (entrée standard) et si le numéro entré est parmi les disponibles, le mot correspondant («file1» dans l'exemple) est attribué au,nom de fichier variable. Dans notre exemple, nous avons spécifié Echo "$ nom de fichier" Comme la commande à exécuter une fois le choix effectué: en conséquence: le mot sélectionné est imprimé à l'écran. Le numéro que nous entrons pour spécifier notre choix est également stocké dans une variable: RÉPONDRE.

Vous remarquerez peut-être qu'une chose étrange s'est produite dans l'exemple ci-dessus: une fois que nous avons effectué notre choix, après l'exécution de la commande, nous avons été à nouveau invité à un choix, pourquoi? Cela s'est produit parce que nous n'avons pas fourni un casser
commande. Nous pouvons facilement résoudre ce problème:

$ files = "$ (ls -a .) "$ sélectionner le nom de fichier dans $ fichiers; faire écho" vous avez sélectionné $ nom de fichier "; pause; fait 1) fichier1 2) fichier2 3) file3 #? 1 Vous avez sélectionné Fichier1

Et si nous ne fournissons aucune sélection? L'invite est simplement répétée jusqu'à ce que nous le fassions:

Sélectionnez le nom de fichier dans $ fichiers; faire echo "vous avez sélectionné $ nom de fichier"; casser; fait 1) fichier1 2) fichier2 3) fichier3 #? 1) fichier1 2) fichier2 3) fichier3 #? 

Et si nous entrons un nombre qui n'est pas dans la liste à la place? Dans ce cas, la variable que nous utilisons, nom de fichier dans notre cas, est définie sur nul.

Changer l'invite de sélection

Comme nous l'avons déjà vu, l'invite utilisée par le shell dans le contexte d'une instruction SELECT est la PS3 invite, qui par défaut, a le #? La chaîne a une valeur. Ce n'est pas très convivial, donc nous voulons peut-être le changer et utiliser quelque chose de plus descriptif à la place. Comment peut-on faire ça? Très simple: nous devons modifier la valeur du PS3 paramètre:

$ Ps3 = "Veuillez saisir votre choix:"


La prochaine fois que nous utiliserons le sélectionner déclaration, nous remarquerons le changement:

Sélectionnez le nom de fichier dans $ fichiers; faire echo "vous avez sélectionné $ nom de fichier $ réponse"; casser; fait 1) fichier1 2) fichier2 3) fichier 3 entrez votre choix: 

La modification apportée à la variable ne sera efficace que pour la section de coquille actuelle et, si nous exporter La variable, également dans tous ses enfants:

$ export ps3 = "Veuillez saisir votre choix:"

Le changement, cependant, reste temporaire jusqu'à ce que nous définissions le PS3 variable à l'intérieur du .bashrc déposer. PS3 n'est qu'une des invites utilisées dans Bash: Vérifiez notre article de Bash Invite si vous voulez en savoir plus sur le sujet.

Conclusions

Dans ce tutoriel, nous avons appris à utiliser le bash sélectionner déclaration. Nous avons vu comment cela fonctionne et comment nous pouvons l'utiliser pour créer un menu de sélection pour demander de manière interactive à un utilisateur d'effectuer un choix. Enfin, nous avons vu comment personnaliser l'invite affichée dans le menu de sélection en modifiant le shell PS3 paramètre.

Tutoriels Linux connexes:

  • Masterring Bash Script Loops
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Boucles imbriquées dans les scripts bash
  • Choses à installer sur Ubuntu 20.04
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Gestion de la saisie des utilisateurs dans les scripts bash
  • Tutoriel de débogage GDB pour les débutants
  • Système linux hung? Comment s'échapper vers la ligne de commande et…
  • Comment configurer un serveur OpenVPN sur Ubuntu 20.04