Aller au contenu

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.

#!/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.

Une fonction peut communiquer de deux façons :

Fenêtre de terminal
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" # 7
  • return N ou le dernier code de sortie : réussite ou échec (0 à 255).
  • echo : valeur à récupérer avec $(...).
Fenêtre de terminal
compteur=10
incrementer() {
local compteur=0 # sans « local », la variable globale serait modifiée
(( compteur++ ))
}
incrementer
echo "$compteur" # 10
#!/usr/bin/env bash
echo "Script : $0"
echo "Premier argument : $1"
echo "Nombre d'arguments : $#"
for arg in "$@"; do # parcourir tous les arguments
echo "- $arg"
done

Toujours écrire "$@" (avec guillemets) : chaque argument reste intact, même s’il contient des espaces.

Fenêtre de terminal
if [[ $# -lt 2 ]]; then
echo "Usage : $0 <source> <destination>" >&2
exit 1
fi
source="$1"
destination="$2"

Forme plus courte pour un argument obligatoire :

Fenêtre de terminal
source="${1:?Usage: $0 <source> <destination>}"
Fenêtre de terminal
commande="$1"
shift # $2 devient $1, etc.
echo "Commande : $commande, arguments restants : $*"

Pour des options du type -v ou -n 5 :

#!/usr/bin/env bash
usage() {
echo "Usage : $0 [-v] [-n nombre] dossier" >&2
}
verbeux=0
nombre=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 ;;
esac
done
shift $(( 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.

Fenêtre de terminal
./script.sh -v -n 10 /var/log

Placer les fonctions dans un fichier et le charger avec source :

outils.sh
log() { echo "$(date '+%F %T') $*"; }
#!/usr/bin/env bash
source "$(dirname "$0")/outils.sh"
log "Démarrage"