GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Scripting - Analyser les arguments dans les scripts Bash à l'aide de getopts

Passer des arguments à un programme est l'une des opérations courantes dans tous les langages que vous utilisez. De même, dans cet article, nous allons voir comment analyser les arguments dans les scripts bash à l'aide de la fonction intégrée getopts bash sous Linux.

Présentation

Chaque commande que nous exécutons dans le terminal est associée à un argument. Par exemple, vous pouvez prendre la commande la plus basique sous Linux nommée df qui affiche l'utilisation de l'espace disque du système de fichiers. Il accepte les arguments/flags comme -h , -i , --version , etc.

De la même manière, lorsque vous créez des scripts shell en fonction du cas d'utilisation, vous devrez peut-être traiter le script en fonction de l'argument passé.

Il existe deux façons d'analyser les arguments passés au script dans bash.

L'une consiste à écrire la logique pour analyser manuellement les arguments à l'aide des variables spéciales [email protected], $1, $2 … $N. Une autre façon serait d'utiliser getopts .

Getopts est une fonction intégrée bash compatible POSIX qui accepte des arguments courts comme -h , -v , -b , etc. Vous ne pouvez pas passer de longs arguments comme --help , --version . Si vous souhaitez analyser de longues options, il existe un autre utilitaire appelé getopt qui est un programme externe et non bash intégré.

Il y a trois scénarios possibles auxquels je peux penser lorsque je travaille avec des drapeaux/arguments.

  • Le script qui s'exécute même lorsqu'aucun argument ou indicateur n'est passé.
  • Le script qui accepte les drapeaux mais sans arguments.
  • Le script qui accepte les indicateurs et les arguments associés pour l'indicateur.

Vous apprendrez à créer un script bash répondant aux scénarios ci-dessus dans les sections à venir.

Obtenir de l'aide

Vous pouvez exécuter la commande help suivante pour accéder à la section d'aide getopts.

$ getops -help

Construction de base de Getops

Il y a quatre termes importants que vous devez connaître pour travailler avec getops.

getopts :getopts optstring nom [arg …]
  1. OPTSTRING - La liste des caractères qui sont reconnus comme arguments. Exemple :-h , -v .
  2. OPTNAME - L'argument analysé de [email protected] sera stocké dans le OPTNAME variable. Vous pouvez utiliser n'importe quel nom comme optname.
  3. OPTARG - S'il y a des arguments supplémentaires passés, ils sont stockés dans le OPTARG variables.
  4. OPTIND - Index pointant vers le prochain argument à traiter.

Lorsque vous transmettez les arguments au script, ils seront stockés dans la variable [email protected] Getopts obtiendra la liste des arguments de [email protected] utilisez OPTIND et analysez-le.

Vous devez spécifier la liste des arguments reconnus dans OPTSTRING . La boucle While est utilisée pour itérer sur la liste des arguments passés et en utilisant OPTIND , getopts obtiendra l'argument et le stockera dans OPTNAME .

La déclaration de cas est utilisé pour vérifier si le modèle correspond à OPTNAME et exécutez l'instruction correspondante.

Je vais exécuter le code ci-dessous tout au long de l'article. C'est un code simple à comprendre. J'ai d'abord créé une fonction nommée "help " où il y a une syntaxe d'utilisation pour mon script.

J'utilise trois arguments dans OPTSTRING; "-s , -T , -h ". Variable nommée ARG est le OPTNAME utilisé dans le code ci-dessous. L'argument analysé sera stocké dans $ARG et en utilisant l'instruction case, il essaiera de trouver si le modèle correspond à l'argument dans le ARG variables.

Le script suivant acceptera des drapeaux comme -s , -h , -T et vous pouvez également combiner des drapeaux comme -shT .

#!/bin/bashfunction help(){ echo "USAGE :args.sh -s, -T , -h"}while getopts ":sT:h" ARG ; do case "$ARG" in s) echo "Running -s flag";; T) echo "Running -T flag" echo "L'argument passé est $OPTARG";; h) aide;; :​) echo "argument manquant";; \?) echo "Quelque chose ne va pas";; esacdoneshift "$((OPTIND-1))"

La fonctionnalité du code ci-dessus sera expliquée en détail dans la prochaine section.

Aucun argument passé

Le comportement par défaut de getopts est que si aucun argument n'est passé, il ne lancera pas de message d'erreur et se terminera avec le code de retour zéro .

Dans certains cas, le script ne doit pas s'exécuter lorsqu'aucun argument n'est passé. Dans ce cas, vous pouvez utiliser des instructions conditionnelles pour vérifier la longueur des arguments passés ([email protected] ) est nul ou non. Si aucun argument n'est passé, le script échouera.

Jetez un oeil au code ci-dessous. Je stocke les arguments passés dans la variable PASSED_ARGS et en vérifiant la longueur. Si la longueur de PASSED_ARGS n'est pas nul, alors while loop avec getops s'exécutera, sinon help la fonction s'exécutera et le script se terminera avec le code de retour 1 .

[email protected]if [[ ${#PASSED_ARGS} -ne 0 ]]then while getopts ":sT:h" ARG ; do case "$ARG" in s) echo "Running -s flag";; T) echo "Running -T flag" echo "L'argument passé est $OPTARG";; h) aide;; :​) echo "argument manquant pour $ARG";; \?) echo "Quelque chose ne va pas";; esac doneelse help exit 1fishift "$((OPTIND-1))"

Vous pouvez également utiliser la ligne suivante pour évaluer les arguments passés.

[[ ${#PASSED_ARGS} -ne 0 ]] &&echo "Arguments stockés dans \[email protected] =[email protected]" || { echo "Aucun argument passé" ; aider; sortie 1 ; } 

Arguments avec drapeaux et arguments pris en charge

Vous pouvez soit simplement passer des drapeaux comme -h ou -s au script ou aux drapeaux et à l'argument associé comme -T à cela. Vous devez ajouter un deux-points ( : ) après l'identifiant du drapeau (-T ) pour que le drapeau accepte l'argument.

Dans le code ci-dessous, vous pouvez voir que j'ai ajouté deux-points (: ) après l'identifiant T . Cela signifie que lorsque je passe le -T drapeau au script, je devrais lui passer un argument supplémentaire.

while getopts ":sT:h" ARG ; faire

Lorsqu'un argument est passé au drapeau, il sera stocké dans la variable $OPTARG . Vous devez écrire une logique pour capturer la variable et la traiter en conséquence. Copiez et exécutez le même code de la section précédente.

T) echo "Running -T flag" echo "L'argument passé est $OPTARG";;

Vous pouvez également combiner et exécuter plusieurs arguments à la fois.

Gestion des erreurs

Il peut y avoir des situations où les arguments sont mal passés et le script devrait générer des erreurs.

Par défaut, getopts lancera un message d'erreur lorsqu'un indicateur passé n'est pas dans OPTSTRING ou si vous ne parvenez pas à transmettre des arguments supplémentaires à l'indicateur. Ajouter un deux-points au début de OPTSTRING supprimera les messages d'erreur par défaut.

Supprimons les deux-points et réexécutons le script. Je passe -x comme premier argument qui n'est pas présent dans OPTSTRING . Deuxièmement, -T nécessite un argument supplémentaire que je n'ai pas fourni Dans les deux cas, cela me renvoie l'erreur.

Désormais, vous pouvez supprimer les messages d'erreur par défaut et imprimer vos propres messages d'erreur. Jetez un œil aux modèles ci-dessous à partir de l'instruction de cas.

  • Colon (:) -> Si aucun argument supplémentaire n'est passé OPTARG sera défini sur deux-points et vous pouvez écrire une logique pour imprimer les messages d'erreur.
  • \ ? -> Lorsqu'un argument n'est pas dans OPTSTRING est passé, OPTNAME sera défini sur "? ".
 :​) echo "argument manquant" ;;\?) echo "Quelque chose ne va pas" ;;

Utilisation de Shift et OPTIND

Si vous prenez des scripts existants écrits à l'aide de getopts, vous verrez cette déclaration après while boucle.

shift "$((OPTIND-1))"

Lorsque le script est déclenché, OPTIND est défini sur 1 . L'OPTIND pointe vers la position du prochain argument à traiter par getopts.

La déclaration ci-dessus supprimera toutes les options analysées par les getopts et $1 ne sera pas défini sur le premier argument non facultatif passé au script.

Conclusion

Dans cet article, nous avons vu comment analyser les arguments dans les scripts bash à l'aide de la fonction getopts. Getopts ne prend en charge qu'une forme courte d'arguments et vous ne pouvez pas passer d'arguments longs.

Au début, il peut sembler difficile de travailler avec getops. Mais si vous comprenez le concept de base, cela devient facile.

Lecture similaire :

  • Comment analyser les fichiers CSV dans les scripts Bash sous Linux

Guides de script bash :

  • Comment créer des boîtes de dialogue GUI dans des scripts Bash avec Zenity sous Linux et Unix
  • Scripts bash – Énoncé de cas
  • Scripts bash – Instructions conditionnelles
  • Scripts bash – Manipulation de chaînes
  • Scripts bash – Explication de la commande Printf à l'aide d'exemples
  • Scripts bash – Tableau indexé expliqué à l'aide d'exemples
  • Scripts bash - Tableau associatif expliqué avec des exemples
  • Scripts bash – Explication de la boucle For avec des exemples
  • Scripts bash :boucle While et Until expliquée à l'aide d'exemples
  • La redirection bash expliquée avec des exemples
  • Scripts bash – Variables expliquées à l'aide d'exemples
  • Scripts bash – Fonctions expliquées à l'aide d'exemples
  • La commande Bash Echo expliquée avec des exemples sous Linux
  • Tutoriel Bash Heredoc pour les débutants

Linux
  1. Utilisation de Bash pour l'automatisation

  2. Gestion des erreurs dans les scripts Bash

  3. Ajouter des arguments et des options à vos scripts Bash

  4. Script bash (I)

  5. Utilisation de la commande Linux Basename dans les scripts Bash

Shell Scripting pour les débutants - Comment écrire des scripts Bash sous Linux

Script bash (II)

Utilisation de la commande Linux Dirname dans les scripts Bash

Bash Beginner Series #5 :Utilisation des opérateurs arithmétiques dans les scripts Bash

Bash Beginner Series #3 :Passer des arguments aux scripts Bash

Création de classes et d'objets à l'aide de scripts bash