Maîtriser le Traitement des Arguments dans les Scripts Bash

Introduction au traitement des paramètres

Lors de la création de scripts Bash, la capacité à interpréter et à valider les arguments passés en ligne de commande est fondamentale. Cela permet de rendre les scripts dynamiques, interactifs et robustes. Cet article explore les différentes techniques pour capturer, itérer et valider ces entrées.

  1. Routage des actions avec l'instruction conditionnelle

Lorsqu'un script attend une commande spécifique (comme démarrer, arrêter ou redémarrer un service), la structure case est idéale pour diriger le flux d'exécution. Par défaut, cette évaluation est sensible à la casse.

#!/bin/bash
# Script de gestion d'un service fictif

ACTION=$1

case "$ACTION" in
    demarrer)
        echo "Initialisation du service..."
        ;;
    arreter)
        echo "Arrêt du service en cours..."
        ;;
    redemarrer)
        echo "Redémarrage du service..."
        ;;
    *)
        echo "Syntaxe : $(basename "$0") {demarrer|arreter|redemarrer}"
        exit 1
        ;;
esac

Si vous souhaitez ignorer la casse lors de la correspondance des motifs, vous pouvez activer l'option nocasematch via la commande intégrée shopt.

#!/bin/bash
shopt -s nocasematch # Active l'insensibilité à la casse

case "$1" in
    start) echo "Démarrage..." ;;
    stop)  echo "Arrêt..." ;;
    *)     echo "Option non reconnue." ;;
esac

shopt -u nocasematch # Désactive l'option pour le reste du script

  1. Consommation séquentielle avec la commande de décalage

Pour traiter un nombre varible d'arguments de manière séquentielle, la commande shift est particulièrement utile. Elle décale les paramètres positionnels vers la gauche, supprimant le premier argument ($1) et réduisant le compteur total ($#).

#!/bin/bash
# Traitement séquentiel des fichiers passés en argument

while [ "$#" -gt 0 ]; do
    FICHIER_COURANT="$1"
    echo "Analyse du fichier : $FICHIER_COURANT (Reste: $#)"
    
    # Logique de traitement ici
    
    shift # Passe à l'argument suivant
done

Il est également possible de décaler de plusieurs positions à la fois en passant un entier à shift. Cependant, si l'entier dépasse le nombre d'arguments restants, la commande échoue. Il est donc crucial de vérifier son code de retour.

#!/bin/bash
# Traitement par blocs de deux arguments (clé-valeur)

while [ -n "$1" ]; do
    CLE="$1"
    VALEUR="$2"
    echo "Configuration : $CLE = $VALEUR"
    
    shift 2
    if [ $? -ne 0 ]; then
        echo "Erreur : Nombre d'arguments impair ou épuisé."
        break
    fi
done

  1. Itération sur l'ensemble des paramètres

Lorsque l'ordre des arguments n'importe pas ou que vous devez appliquer la même opération à chaque entrée, une boucle for combinée aux variables spéciales $@ ou $* est la méthode privilégiée.

#!/bin/bash
# Vérification de l'existence de plusieurs répertoires

if [ "$#" -eq 0 ]; then
    echo "Veuillez fournir au moins un chemin de répertoire."
    exit 1
fi

compteur=1
echo "--- Utilisation de \$@ ---"
for chemin in "$@"; do
    if [ -d "$chemin" ]; then
        echo "$compteur. Le répertoire '$chemin' est valide."
    else
        echo "$compteur. Le répertoire '$chemin' est introuvable."
    fi
    ((compteur++))
done

Il est recommandé d'utiliser "$@" (avec les guillemets) plutôt que $*, car cela préserve les espaces éventuels présents dans les arguments individuels, évitant ainsi des erreurs de parsing.

  1. Introspection du script et validation des entrées

La variable $0 contient le nom du script tel qu'il a été invoqué. Elle est couramment utilisée pour générer dynamiqeument des messages d'aide, garantissant que le nom affiché reste correct même si le fichier est renommé.

#!/bin/bash
# Validation stricte des paramètres d'entrée

NOM_SCRIPT=$(basename "$0")
NB_ARGS_REQUIS=2

# Vérification du nombre d'arguments
if [ "$#" -ne "$NB_ARGS_REQUIS" ]; then
    echo "Erreur de syntaxe."
    echo "Utilisation : $NOM_SCRIPT [repertoire_source] [fichier_destination]"
    exit 2
fi

REP_SRC="$1"
FICH_DEST="$2"

# Vérification de l'existence du répertoire source
if [ ! -d "$REP_SRC" ]; then
    echo "Erreur : Le répertoire source '$REP_SRC' n'existe pas."
    exit 3
fi

# Vérification des droits d'écriture sur le fichier de destination
if [ -e "$FICH_DEST" ] && [ ! -w "$FICH_DEST" ]; then
    echo "Erreur : Permissions insuffisantes pour écrire dans '$FICH_DEST'."
    exit 4
fi

echo "Validation réussie. Prêt à traiter les données de '$REP_SRC' vers '$FICH_DEST'."

Au-delà de la simple vérification du nombre d'arguments, il est impératif d'évaluer leur nature (fichier, réperotire), leurs permissions (lecture, écriture) et leur validité avant d'exécuter la logique métier du script.

Étiquettes: bash shell-scripting Linux command-line-arguments bash-parameters

Publié le 2 juin à 02h15