Passer un tableau à une fonction, une fonctionnalité de base pour les langages modernes, n’est pas si évident en shell. Surtout en bash comme vous le verrez plus bas. Si j’ai facilement trouvé une solution en ksh, il m’a fallu deux jours de réflexion et d’essais-erreurs pour y arriver en bash.
Objectif:[ol]
[li]créer deux tableaux (arrays)[/li]
[li]passer ces tableaux à une fonction qui, pour l’exemple, va simplement afficher leur contenu.[/li]
[li]assurer une portée locale des tableaux à l’intérieur de la fonction.[/li][/ol]
Solutions:[ul]
[li]On commence par le plus facile (ksh):
[code]#!/usr/bin/ksh
passage de tableau par référence à une fonction
function print_tableau {
# copie locale du tableau par référence aux paramètres $1 $2 etc…
typeset -n tab_local=$1
# affichage des éléments du tableau local
echo; echo "$1"
for item in ${!tab_local[@]}; do
echo " [${item}] => ${tab_local[$item]}"
done
}
affectation des tableaux
couleurs=('Rose' 'Gris clair' 'Vert')
etats=('Liquide' 'Solide' 'Gaz')
appel à la fonction avec passage des tableaux
print_tableau "couleurs"
print_tableau "etats"
vérification que le tableau “local” tab_local de la fonction n’existe plus ici
echo; echo "Contenu de tab_local -->${tab_local[*]}<--"
[/code]
[/li]
[li]Un peu (!) plus ardu en bash:
[code]#!/bin/bash
passage de tableau par référence à une fonction
function print_tableau {
# On met le IFS (Internal Field Separator) à NULL
# ceci est indispensable pour préserver l’espace dans “Gris clair”
# lors de l’expansion ${couleurs[*]} qui a lieu plus bas
OLD_IFS=$IFS
IFS=’’
# On crée une chaîne contenant "couleurs[*]"
local tab_str="$1[*]"
# on réaffecte le contenu du tableau $colors à tab_local par référence indirecte
# une copie locale des tableaux "couleurs" et "etats" en quelque sorte
# tab_local=(${couleurs[*]})
local tab_local=(${!tab_str})
# remise de IFS à sa valeur par défaut
IFS=$OLD_IFS
# affichage des éléments du tableau local
echo; echo "$1"
for item in ${!tab_local[@]}; do
echo " [${item}] => ${tab_local[$item]}"
done
}
affectation des tableaux
couleurs=('Rose' 'Gris clair' 'Vert')
etats=('Liquide' 'Solide' 'Gaz')
appel à la fonction avec passage des tableaux
print_tableau "couleurs"
print_tableau "etats"
vérification que le tableau “local” tab_local de la fonction n’existe plus ici
echo; echo "Contenu de tab_local -->${tab_local[*]}<--"
[/code]
[/li]
[li]Liens divers
unix.com/shell-programming-s … ction.html
tldp.org/LDP/abs/html/bashver2.html#VARREFNEW[/li][/ul]
Ceci peut aussi servir pour “copier” un tableau. Le réaffecter à une autre variable.
Vous comprenez pourquoi je préfère ksh? :smt002