====== 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] ...