Analyser les options et les arguments avec getopts
Implémentez des interfaces professionnelles en ligne de commande avec getopts pour les options courtes, les arguments obligatoires et les messages d’utilisation.
Analyser les options et les arguments avec getopts est une leçon Linux Command Line & Bash Scripting Mastery gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Linux Command Line & Bash Scripting Mastery, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Linux Command Line & Bash Scripting Mastery comprend 4 leçons au total.
Pourquoi getopts existe
Tout script réaliste doit un jour accepter des options comme -v, -o output.txt ou -n 5. Les analyser manuellement avec $1, $2… devient rapidement fragile.
getopts est la commande intégrée standardisée par POSIX qui gère de manière fiable les options courtes (-a, -b), y compris celles qui prennent un argument. Elle est intégrée à tous les shells POSIX, aucune dépendance n'est donc nécessaire.
- Gère les indicateurs regroupés :
-vn 5=-v -n 5 - Signale proprement les options inconnues
- Définit automatiquement les variables standard
OPTINDetOPTARG
Dans cette leçon, vous allez créer à partir de zéro une interface CLI complète et professionnelle avec getopts.
La syntaxe de getopts
La syntaxe de base est une boucle while qui appelle getopts à chaque itération :
while getopts "optstring" varname; do
case "$varname" in
...
esac
done- optstring — une chaîne listant chaque lettre d'option acceptée. Deux-points après une lettre signifie que cette option nécessite un argument.
- varname — reçoit la lettre de l'option actuelle à chaque itération.
- OPTARG — reçoit automatiquement la valeur de l'argument lorsqu'un deux-points suit la lettre.
- OPTIND — index du prochain argument à traiter ; utilisez
shift $((OPTIND - 1))après la boucle pour exposer les paramètres positionnels restants.
#!/usr/bin/env bash
# Minimal skeleton — shows the loop structure
while getopts 'vn:' opt; do
case "$opt" in
v) echo "Verbose mode on" ;;
n) echo "Count = $OPTARG" ;;
?) echo "Unknown option: -$OPTARG" >&2; exit 1 ;;
esac
doneDéfinir un optstring
L'optstring est une déclaration compacte du contrat de votre interface CLI. Chaque caractère représente un indicateur accepté.
'abc'— accepte-a,-bet-c(sans arguments)'a:bc'—-anécessite un argument ;-bet-cn'en nécessitent pas':abc'— un deux-points initial active le mode d'erreur silencieux (votre script gère les mauvaises options au lieu que le shell affiche un message)
Le mode silencieux est préférable dans les scripts de production, car il vous donne un contrôle total sur les messages d'erreur et les codes de sortie.
#!/usr/bin/env bash
# optstring ':o:vq'
# -o requires an argument (output file)
# -v verbose flag (no argument)
# -q quiet flag (no argument)
# Leading ':' = silent error mode
while getopts ':o:vq' opt; do
case "$opt" in
o) OUTPUT="$OPTARG" ;;
v) VERBOSE=1 ;;
q) QUIET=1 ;;
:) echo "Error: -$OPTARG requires an argument" >&2; exit 1 ;;
\?) echo "Error: unknown option -$OPTARG" >&2; exit 1 ;;
esac
done
echo "OUTPUT=$OUTPUT VERBOSE=$VERBOSE QUIET=$QUIET"OPTARG et les arguments obligatoires
Lorsqu'un indicateur est suivi d'un deux-points dans l'optstring, getopts enregistre sa valeur dans OPTARG. L'utilisateur peut écrire l'argument avec ou sans espace :
-o report.txt-oreport.txt
Les deux formes sont analysées de manière identique. C'est l'un des principaux avantages par rapport à l'analyse manuelle avec $1/shift.
En mode silencieux (':' au début de l'optstring), l'absence d'un argument amène getopts à définir varname sur : et OPTARG sur la lettre de l'option, ce qui est idéal pour afficher un message d'erreur ciblé.
#!/usr/bin/env bash
# Demonstrate OPTARG with a file-processing script
while getopts ':i:o:' opt; do
case "$opt" in
i) INPUT="$OPTARG" ;;
o) OUTPUT="$OPTARG" ;;
:) echo "Error: option -$OPTARG needs a value" >&2; exit 1 ;;
\?) echo "Error: unknown flag -$OPTARG" >&2; exit 1 ;;
esac
done
echo "Input : ${INPUT:-<not set>}"
echo "Output : ${OUTPUT:-<not set>}"Passer les options avec OPTIND
Lorsque getopts a terminé, OPTIND contient l'index du premier argument qui n'est pas une option. Utilisez shift pour supprimer toutes les options traitées afin que $1, $2… désignent les paramètres positionnels restants (par exemple, les noms de fichiers).
La construction idiomatique est toujours :
shift $((OPTIND - 1))Après le décalage, $@ contient uniquement les arguments qui n'étaient pas des indicateurs, c'est-à-dire les opérandes de votre commande.
#!/usr/bin/env bash
# Shows OPTIND shift and leftover positional args
VERBOSE=0
while getopts ':vn:' opt; do
case "$opt" in
v) VERBOSE=1 ;;
n) COUNT="$OPTARG" ;;
:) echo "Error: -$OPTARG requires an argument" >&2; exit 1 ;;
\?) echo "Error: unknown option -$OPTARG" >&2; exit 1 ;;
esac
done
shift $((OPTIND - 1))
echo "VERBOSE=$VERBOSE COUNT=${COUNT:-1}"
echo "Remaining args: $*"Écrire une fonction d'utilisation
Un script professionnel fournit toujours une fonction usage() qui affiche un message d'aide et quitte le shell. La convention est la suivante :
- Afficher sur la sortie d'erreur standard (descripteur 2) afin de ne pas polluer la sortie dirigée vers un pipeline
- Quitter avec le code 0 pour
-h/--help, et avec le code 1 en cas d'utilisation invalide - Appeler
usage 1depuis les chemins d'erreur etusage 0depuis le gestionnaire de-h
#!/usr/bin/env bash
usage() {
cat >&2 <<EOF
Usage: $(basename "$0") [-v] [-n COUNT] [-o FILE] [FILE...]
Options:
-v Verbose output
-n COUNT Repeat COUNT times (default: 1)
-o FILE Write output to FILE
-h Show this help
EOF
exit "${1:-0}"
}
while getopts ':vn:o:h' opt; do
case "$opt" in
v) VERBOSE=1 ;;
n) COUNT="$OPTARG" ;;
o) OUTFILE="$OPTARG" ;;
h) usage 0 ;;
:) echo "Error: -$OPTARG requires a value" >&2; usage 1 ;;
\?) echo "Error: unknown option -$OPTARG" >&2; usage 1 ;;
esac
done
shift $((OPTIND - 1))
echo "Parsed OK — verbose=${VERBOSE:-0} count=${COUNT:-1} out=${OUTFILE:--}"Valeurs par défaut et validation
Après l'analyse, validez les valeurs et définissez les valeurs par défaut avant d'effectuer un quelconque travail réel. Séparez la phase d'analyse (la boucle) de la phase logique. Les deux sections sont ainsi plus faciles à lire et à tester.
- Utilisez
${VAR:-default}pour les valeurs par défaut intégrées - Validez les arguments numériques avec une expression régulière ou une vérification arithmétique
- Vérifiez que les options obligatoires ont bien été fournies
#!/usr/bin/env bash
usage() { echo "Usage: $(basename "$0") -n COUNT [-v]" >&2; exit 1; }
VERBOSE=0
COUNT=''
while getopts ':n:v' opt; do
case "$opt" in
n) COUNT="$OPTARG" ;;
v) VERBOSE=1 ;;
:) echo "Error: -$OPTARG needs a value" >&2; usage ;;
\?) echo "Error: -$OPTARG unknown" >&2; usage ;;
esac
done
shift $((OPTIND - 1))
# Validation phase
[[ -z "$COUNT" ]] && { echo "Error: -n COUNT is required" >&2; usage; }
[[ "$COUNT" =~ ^[0-9]+$ ]] || { echo "Error: COUNT must be a positive integer" >&2; usage; }
for (( i=1; i<=COUNT; i++ )); do
[[ $VERBOSE -eq 1 ]] && echo "Iteration $i of $COUNT"
echo "Hello, world!"
doneCombiner des indicateurs sur la ligne de commande
getopts gère automatiquement les indicateurs courts regroupés et écrits sans espaces, conformément à la convention Unix :
-v -qéquivaut à-vq-n 5 -véquivaut à-n5 -vou à-vn5
Vous n'avez pas besoin d'écrire de code supplémentaire pour prendre cette forme en charge : getopts parcourt automatiquement chaque caractère d'une chaîne d'options regroupées. C'est une autre raison importante d'utiliser getopts plutôt qu'une analyse manuelle.
#!/usr/bin/env bash
# Test combined flag parsing
# Run as: bash script.sh -vq -n3
VERBOSE=0; QUIET=0; COUNT=1
while getopts ':vqn:' opt; do
case "$opt" in
v) VERBOSE=1 ;;
q) QUIET=1 ;;
n) COUNT="$OPTARG" ;;
:) echo "Error: -$OPTARG needs value" >&2; exit 1 ;;
\?) echo "Error: unknown -$OPTARG" >&2; exit 1 ;;
esac
done
shift $((OPTIND - 1))
echo "verbose=$VERBOSE quiet=$QUIET count=$COUNT"Gérer le séparateur double tiret
Les commandes Unix acceptent -- (double tiret) comme signal explicite indiquant que le traitement des options doit s'arrêter. Tout ce qui suit -- est traité comme un argument positionnel, même si cela ressemble à un indicateur.
getopts s'arrête automatiquement lorsqu'il rencontre --. Après shift $((OPTIND - 1)), le double tiret a disparu et $@ contient uniquement les opérandes.
C'est important pour les scripts qui travaillent sur des noms de fichiers pouvant commencer par un tiret, par exemple :
myscript.sh -v -- -strangefile.txt#!/usr/bin/env bash
# Demonstrate -- separator
# Run as: bash script.sh -v -- file1.txt -oddname.txt
VERBOSE=0
while getopts ':v' opt; do
case "$opt" in
v) VERBOSE=1 ;;
\?) echo "Unknown option -$OPTARG" >&2; exit 1 ;;
esac
done
shift $((OPTIND - 1)) # removes -v and the '--' separator
echo "Verbose: $VERBOSE"
echo "Files to process:"
for f in "$@"; do
echo " -> $f"
doneEncapsuler getopts dans une fonction de bibliothèque
Dans les scripts modulaires, vous pouvez encapsuler getopts dans une fonction parse_args() qui définit des variables globales (ou des variables référencées par nom). Cela permet de garder main() clair et de charger l'analyseur depuis d'autres scripts.
Règles essentielles de ce modèle :
- Déclarez les variables d'option avant d'appeler la fonction
- Utilisez des variables
globalou transmettez les valeurs par référence nommée (declare -n) - Retournez un code de sortie différent de zéro en cas d'entrée incorrecte afin que
mainpuisse réagir
#!/usr/bin/env bash
# Global option variables
VERBOSE=0; OUTPUT=''; COUNT=1
parse_args() {
local opt
while getopts ':vn:o:h' opt; do
case "$opt" in
v) VERBOSE=1 ;;
n) COUNT="$OPTARG" ;;
o) OUTPUT="$OPTARG" ;;
h) echo "Usage: $(basename "$0") [-v] [-n N] [-o FILE]"; exit 0 ;;
:) echo "Error: -$OPTARG needs a value" >&2; return 1 ;;
\?) echo "Error: unknown option -$OPTARG" >&2; return 1 ;;
esac
done
shift $((OPTIND - 1))
ARGS=("$@") # leftover positional args stored in array
}
main() {
parse_args "$@" || exit 1
echo "verbose=$VERBOSE count=$COUNT output=${OUTPUT:--} args=${ARGS[*]}"
}
main "$@"Exemple complet en situation réelle : un archiveur de journaux
Voici un script complet, réaliste, qui utilise tout ce qui a été présenté dans cette leçon : un optstring avec arguments obligatoires, le mode d'erreur silencieux, une fonction d'utilisation, des valeurs par défaut, la validation et le décalage avec OPTIND.
Étudiez sa structure : c'est le modèle que vous devez suivre dans chaque script nécessitant une interface CLI.
#!/usr/bin/env bash
# archive_logs.sh — compress and move logs older than N days
set -euo pipefail
DESTDIR='/tmp/log_archive'
DAYS=30
VERBOSE=0
usage() {
cat >&2 <<EOF
Usage: $(basename "$0") [-v] [-d DAYS] [-o DIR] SOURCE_DIR
-d DAYS Archive logs older than DAYS (default: 30)
-o DIR Destination directory (default: /tmp/log_archive)
-v Verbose output
-h Show this help
EOF
exit "${1:-0}"
}
while getopts ':d:o:vh' opt; do
case "$opt" in
d) DAYS="$OPTARG" ;;
o) DESTDIR="$OPTARG" ;;
v) VERBOSE=1 ;;
h) usage 0 ;;
:) echo "Error: -$OPTARG requires a value" >&2; usage 1 ;;
\?) echo "Error: unknown option -$OPTARG" >&2; usage 1 ;;
esac
done
shift $((OPTIND - 1))
# Validation
[[ $# -lt 1 ]] && { echo "Error: SOURCE_DIR is required" >&2; usage 1; }
[[ "$DAYS" =~ ^[0-9]+$ ]] || { echo "Error: DAYS must be numeric" >&2; exit 1; }
SOURCE="$1"
[[ -d "$SOURCE" ]] || { echo "Error: '$SOURCE' is not a directory" >&2; exit 1; }
mkdir -p "$DESTDIR"
[[ $VERBOSE -eq 1 ]] && echo "Archiving logs older than $DAYS days from $SOURCE to $DESTDIR"
find "$SOURCE" -name '*.log' -mtime "+$DAYS" -print | while read -r f; do
gzip -c "$f" > "$DESTDIR/$(basename "$f").gz"
[[ $VERBOSE -eq 1 ]] && echo " archived: $f"
done
echo "Done."Vérification rapide : optstring de getopts
Lisez l'appel getopts suivant et choisissez la description correcte de son comportement :
while getopts ':f:vq' opt; doRécapitulatif de la leçon : maîtriser getopts
Vous avez appris à créer des interfaces professionnelles en ligne de commande dans Bash à l'aide de getopts. Voici un résumé des points essentiels :
- Syntaxe de l'optstring — les lettres sans deux-points sont des indicateurs booléens ; un deux-points après une lettre signifie qu'elle nécessite un argument ; un deux-points initial active le mode d'erreur silencieux
- OPTARG — contient automatiquement la valeur de l'argument pour les options qui en nécessitent un
- OPTIND — utilisez
shift $((OPTIND - 1))après la boucle pour exposer les paramètres positionnels restants dans$@ - Mode d'erreur silencieux — recommandé en production ; gérez vous-même les cas
:(argument manquant) et\?(option inconnue) pour garder le contrôle - Fonction
usage()— écrivez-en toujours une ; affichez le message sur la sortie d'erreur standard, quittez avec 0 pour-het avec 1 en cas d'erreur - Indicateurs regroupés — getopts gère automatiquement
-vqet-n5, sans code supplémentaire - Modèle modulaire — encapsulez getopts dans une fonction
parse_args()pour obtenir des scripts clairs et réutilisables
Maîtriser getopts transforme vos scripts d'outils à usage unique en programmes CLI fiables et faciles à utiliser, conformes aux conventions Unix.
Questions Fréquemment Posées
La leçon « Analyser les options et les arguments avec getopts » est-elle gratuite ?
Oui — le texte complet de « Analyser les options et les arguments avec getopts » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Linux Command Line & Bash Scripting Mastery, passe à CoddyKit PRO. Le cours Linux Command Line & Bash Scripting Mastery comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Analyser les options et les arguments avec getopts » ?
Implémentez des interfaces professionnelles en ligne de commande avec getopts pour les options courtes, les arguments obligatoires et les messages d’utilisation. Tu pratiques Linux Command Line & Bash Scripting Mastery avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Linux Command Line & Bash Scripting Mastery ?
Aucune expérience préalable n'est requise. Linux Command Line & Bash Scripting Mastery sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Analyser les options et les arguments avec getopts » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Linux Command Line & Bash Scripting Mastery ?
Oui. Chaque leçon Linux Command Line & Bash Scripting Mastery inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Concevoir des fonctions avec une portée locale et des codes de retour
- Créer et charger des bibliothèques Bash réutilisables
- Analyser les options et les arguments avec getopts
- Transmettre des tableaux et des cartes associatives entre fonctions