XII. Tableaux

Tuto réalisé par Eric Sanchis – maître de conférence à l’Université Toulouse 1 Sciences Sociales.

Moins utilisés que les chaînes de caractères ou les entiers, bash intègre également les tableaux monodimensionnels.

XII-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 :

Sélectionnez

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

Sélectionnez

Ex : $ 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 :

Sélectionnez

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 :

Sélectionnez

nomtab[indice]

Sélectionnez

Ex : $ 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 :

Sélectionnez

Ex : $ 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 … )

Sélectionnez

Ex : $ arr=([1]=coucou [3]=hello)
$

– l’option -a de la commande interne read ou readonly :

Sélectionnez

Ex : $ read -a tabmess
bonjour tout le monde
$

XII-2. Valeur d’un élément d’un tableau

On obtient la valeur d’un élément d’un tableau à l’aide la syntaxe :

Sélectionnez

${nomtab[indice]}

bash calcule d’abord la valeur de l’indice puis l’élément du tableau est remplacé par sa valeur.

Il est possible d’utiliser toute expression arithmétique valide de la commande interne (( pour calculer l’indice d’un élément.

Sélectionnez

Ex : $ 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 :

Sélectionnez

${#nomtab[indice]}

Sélectionnez

Ex : $ 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.

Sélectionnez

Ex : $ echo $tabmess
bonjour
$

Réciproquement, une variable non préalablement définie comme tableau peut être interprétée comme un tableau.

Sélectionnez

Ex : $ 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
$

Exercice : Ecrire un programme shell carte qui affiche le nom d’une carte tirée au hasard d’un jeu de 32 cartes. On utilisera deux tableaux : un tableau couleur et un tableau valeur.

Sélectionnez

Ex : $ carte
huit de carreau
$ carte
as de pique
$

XII-3. Caractéristiques d’un tableau

Le nombre d’éléments d’un tableau est désigné par :

Seuls les éléments initialisés sont comptés.

Sélectionnez

${#nomtab[*]}

Sélectionnez

Ex : $ echo ${#arr[*]}
2
$

Tous les éléments d’un tableau sont accessibles à l’aide de la notation :

Sélectionnez

${nomtab[*]}

Seuls les éléments initialisés sont affichés

Sélectionnez

Ex : $ 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 :

Sélectionnez

${ !nomtab[*]}

Sélectionnez

Ex : $ 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 ».

Sélectionnez

Ex : $ 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[*]} )

Sélectionnez

Ex : $ 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
$

Exercice : Ecrire un programme shell distrib qui crée un paquet de 5 cartes différentes tirées au hasard parmi un jeu de 32 cartes et affiche le contenu du paquet.

Exercice : Ecrire un programme shell tabnoms qui place dans un tableau les noms de tous les utilisateurs enregistrés dans le système, affiche le nombre total d’utilisateurs enregistrés, puis tire au hasard un nom d’utilisateur.

Si l’on souhaite créer un tableau d’entiers on utilise la commande declare –ai. L’ordre des options n’a aucune importance.

Sélectionnez

Ex : $ declare –ai tabent=( 2 45 -2 )
$

Pour créer un tableau en lecture seule, on utilise les options –ra :

Sélectionnez

Ex : $ 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
$

XII-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] …


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.

Retour en haut