IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Introduction à la programmation en Bash


précédentsommairesuivant

XII. Tableaux

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


précédentsommairesuivant

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.