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 …]
OPTSTRING
- La liste des caractères qui sont reconnus comme arguments. Exemple :-h
,-v
.OPTNAME
- L'argument analysé de[email protected]
sera stocké dans leOPTNAME
variable. Vous pouvez utiliser n'importe quel nom comme optname.OPTARG
- S'il y a des arguments supplémentaires passés, ils sont stockés dans leOPTARG
variables.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'identifiantT
. Cela signifie que lorsque je passe le-T
drapeau au script, je devrais lui passer un argument supplémentaire.while getopts ":sT:h" ARG ; faireLorsqu'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 deOPTSTRING
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 dansOPTSTRING
. 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