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.
- 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
- 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
- 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.
- 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.