Bash : fonctions et arguments
Les fonctions évitent de répéter du code. Les arguments rendent un script réutilisable. Les exemples utilisent des noms génériques.
Définir et appeler une fonction
Section intitulée « Définir et appeler une fonction »#!/usr/bin/env bash
dire_bonjour() { local nom="$1" # local : la variable n'existe que dans la fonction echo "Bonjour, $nom !"}
dire_bonjour "Alice"dire_bonjour "Bob"Une fonction doit être définie avant son premier appel. Ses arguments se lisent avec $1, $2, $@, comme ceux d’un script.
Valeur de retour et sortie
Section intitulée « Valeur de retour et sortie »Une fonction peut communiquer de deux façons :
est_pair() { (( $1 % 2 == 0 )) # le code de sortie de la dernière commande est renvoyé}
if est_pair 4; then echo "pair"; fi
somme() { echo $(( $1 + $2 )) # « renvoie » une valeur en l'affichant}
total="$(somme 3 4)"echo "$total" # 7return Nou le dernier code de sortie : réussite ou échec (0 à 255).echo: valeur à récupérer avec$(...).
Utiliser local
Section intitulée « Utiliser local »compteur=10incrementer() { local compteur=0 # sans « local », la variable globale serait modifiée (( compteur++ ))}incrementerecho "$compteur" # 10Arguments du script
Section intitulée « Arguments du script »#!/usr/bin/env bashecho "Script : $0"echo "Premier argument : $1"echo "Nombre d'arguments : $#"
for arg in "$@"; do # parcourir tous les arguments echo "- $arg"doneToujours écrire "$@" (avec guillemets) : chaque argument reste intact, même s’il contient des espaces.
Vérifier les arguments
Section intitulée « Vérifier les arguments »if [[ $# -lt 2 ]]; then echo "Usage : $0 <source> <destination>" >&2 exit 1fi
source="$1"destination="$2"Forme plus courte pour un argument obligatoire :
source="${1:?Usage: $0 <source> <destination>}"Décaler les arguments avec shift
Section intitulée « Décaler les arguments avec shift »commande="$1"shift # $2 devient $1, etc.echo "Commande : $commande, arguments restants : $*"Options avec getopts
Section intitulée « Options avec getopts »Pour des options du type -v ou -n 5 :
#!/usr/bin/env bash
usage() { echo "Usage : $0 [-v] [-n nombre] dossier" >&2}
verbeux=0nombre=5
while getopts ":vn:h" opt; do case "$opt" in v) verbeux=1 ;; n) nombre="$OPTARG" ;; h) usage; exit 0 ;; :) echo "Option -$OPTARG : argument manquant" >&2; usage; exit 1 ;; \?) echo "Option inconnue : -$OPTARG" >&2; usage; exit 1 ;; esacdoneshift $(( OPTIND - 1 )) # retire les options : $1 est le premier argument restant
dossier="${1:?dossier manquant}"echo "verbeux=$verbeux nombre=$nombre dossier=$dossier"Dans la chaîne ":vn:h", la lettre suivie de : attend une valeur (n:), et le : initial désactive les messages d’erreur de getopts pour les gérer soi-même.
./script.sh -v -n 10 /var/logFonctions réutilisables dans plusieurs scripts
Section intitulée « Fonctions réutilisables dans plusieurs scripts »Placer les fonctions dans un fichier et le charger avec source :
log() { echo "$(date '+%F %T') $*"; }#!/usr/bin/env bashsource "$(dirname "$0")/outils.sh"log "Démarrage"Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel : Shell Functions