Moins utilisés que les chaînes de caractères ou les entiers, bash intègre également les tableaux monodimensionnels.
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é.
$ 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")'
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.
$ 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 :
$ arr=([1]=coucou [3]=hello)
$ read -a tabmess bonjour tout le monde
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
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 :
$ 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
Pour supprimer un tableau ou élément d'un tableau, on utilise la commande interne unset.