0Pricing
Linux Command Line & Bash Scripting Mastery · Leçon

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 OPTIND et OPTARG

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
done

Dé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, -b et -c (sans arguments)
  • 'a:bc' — -a nécessite un argument ; -b et -c n'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 1 depuis les chemins d'erreur et usage 0 depuis 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!"
done

Combiner 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 -v ou à -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"
done

Encapsuler 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 global ou 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 main puisse 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; do

Ré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 -h et avec 1 en cas d'erreur
  • Indicateurs regroupés — getopts gère automatiquement -vq et -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

  1. Concevoir des fonctions avec une portée locale et des codes de retour
  2. Créer et charger des bibliothèques Bash réutilisables
  3. Analyser les options et les arguments avec getopts
  4. Transmettre des tableaux et des cartes associatives entre fonctions
← Retour à Linux Command Line & Bash Scripting Mastery