====== Tableaux ====== Moins utilisés que les chaînes de caractères ou les entiers, bash intègre également les tableaux monodimensionnels. ===== 1. Définition et initialisation d’un tableau ===== Pour créer un tableau, on utilise généralement l'option -a (comme array) de la commande interne declare : declare -a nomtab ... Le tableau nomtab est simplement créé mais ne contient aucune valeur : le tableau est défini mais n'est pas initialisé. * Pour connaître les tableaux définis : declare -a $ declare -a declare -a BASH_ARGC='()' declare -a BASH_ARGV='()' declare -a BASH_LINENO='()' declare -a BASH_SOURCE='()' declare -ar BASH_VERSINFO='([0]="3" [1]="1" [2]="17" [3]="1" [4]="release" [5]="i486-pc-linux-gnu")' declare -a DIRSTACK='()' declare -a FUNCNAME='()' declare -a GROUPS='()' declare -a PIPESTATUS='([0]="0")' * Pour définir et initialiser un tableau : declare -a nomtab=( val0 val1 ...) Comme en langage C, l'indice d'un tableau débute toujours à 0 et sa valeur maximale est celle du plus grand entier positif représentable dans ce langage (bash a été écrit en C). L'indice peut être une expression arithmétique. * Pour désigner un élément d'un tableau, on utilise la syntaxe : nomtab[indice] $ declare -a tab => définition du tableau tab $ $ read tab[1] tab[3] coucou bonjour $ $ tab[0]=hello Il n'est pas obligatoire d’utiliser la commande interne declare pour créer un tableau, il suffit d'initialiser un de ses éléments : $ array[3]=bonsoir => création du tableau array avec $ => initialisation de l’élément d’indice 3 Trois autres syntaxes sont également utilisables pour initialiser globalement un tableau : * nomtab=( val0 val1 ... ) * nomtab=( [indice]=val ... ) $ arr=([1]=coucou [3]=hello) * l'option -a de la commande interne read ou readonly : $ read -a tabmess bonjour tout le monde ===== 2. Valeur d'un élément d'un tableau ===== On obtient la valeur d'un élément d'un tableau à l’aide la syntaxe : ${nomtab[indice]} bash calcule d'abord la valeur de l'indice puis l'élément du tableau est remplacé par sa valeur. $ echo ${tabmess[1]} tout $ $ echo ${tabmess[RANDOM%4]} # ou bien ${tabmess[$((RANDOM%4))]} monde $ $ echo ${tabmess[1**2+1]} le Pour obtenir la longueur d'un élément d'un tableau : ${#nomtab[indice]} $ echo ${tabmess[0]} bonjour $ $ echo ${#tabmess[0]} 7 => longueur de la chaîne bonjour Lorsqu'un tableau sans indice est présent dans une chaîne de caractères ou une expression, bash utilise l'élément d'indice 0. $ echo $tabmess bonjour Réciproquement, une variable non préalablement définie comme tableau peut être interprétée comme un tableau. $ var=bonjour $ echo ${var[0]} => var est interprétée comme un tableau à un seul élément bonjour => d’indice 0 $ var=( coucou ${var[0]} ) $ echo ${var[1]} => var est devenu un véritable tableau bonjour ====== 3. Caractéristiques d'un tableau ====== Le nombre d'éléments d'un tableau est désigné par : **${#nomtab[*]}** Seuls les éléments initialisés sont comptés. $ echo ${#arr[*]} 2 Tous les éléments d'un tableau sont accessibles à l’aide de la notation : ${nomtab[*]} Seuls les éléments initialisés sont affichés. $ echo ${arr[*]} coucou hello Pour obtenir la liste de tous les indices conduisant à un élément défini d’un tableau, on utilise la syntaxe : ${!nomtab[*]} $ arr=([1]=coucou bonjour [5]=hello) $ $ echo ${!arr[*]} 1 2 5 L’intérêt d’utiliser cette syntaxe est qu’elle permet de ne traiter que les éléments définis d’un tableau « à trous ». $ for i in ${!arr[*]} > do > echo "$i => ${arr[i]}" => dans l’expression ${arr[i]}, bash interprète > done => directement i comme un entier 1 => coucou 2 => bonjour 5 => hello Pour ajouter un élément val à un tableau tab : * à la fin : tab[${#tab[*]}]=val * en tête : tab=( val ${tab[*]} ) $ tab=( un deux trois ) $ echo ${#tab[*]} 3 $ tab[${#tab[*]}]=fin =>ajout en fin de tableau $ echo ${tab[*]} un deux trois fin $ tab=( debut ${tab[*]} ) =>ajout en tête de tableau $ echo ${tab[*]} debut un deux trois fin Si l’on souhaite créer un tableau d’entiers on utilise la commande declare –ai. L’ordre des options n’a aucune importance. $ declare –ai tabent=( 2 45 -2 ) Pour créer un tableau en lecture seule, on utilise les options **–ra** : $ declare -ra tabconst=( bonjour coucou salut ) => tableau en lecture seule $ $ tabconst[1]=ciao -bash: tabconst: readonly variable $ $ declare -air tabInt=( 34 56 ) => tableau (d’entiers) en lecture seule $ echo $(( tabInt[1] +10 )) 66 $ (( tabInt[1] += 10 )) -bash: tabInt: readonly variable ===== 4. Suppression d'un tableau ===== Pour supprimer un tableau ou élément d'un tableau, on utilise la commande interne unset. * Suppression d'un tableau : unset nomtab ... * Suppression d'un élément d'un tableau : unset nomtab[indice] ...