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.