Tableaux en shell

Publié le par greg

Bonjour à tous,
Désolé de ne pas être très assidu au blog en ce moment, j'ai en ce beau printemps pas mal d'occupations prenantes autre que de geeker ;o)

Je vais néanmoins vous concocter un petit article pratique pour ceux qui aiment faire des scripts pour tout automatiser. Créer et parcourir des tableaux en shell.

greg@localhost:~/$ mon_tableau=(un deux trois quatre);
greg@localhost:~/$ echo $mon_tableau
un
greg@localhost:~/$ echo ${mon_tableau[0]}
un
greg@localhost:~/$ echo ${mon_tableau[1]}
deux
greg@localhost:~/$ echo ${mon_tableau[*]}
un deux trois quatre
greg@localhost:~/$ echo ${mon_tableau[@]}
un deux trois quatre
greg@localhost:~/$ echo ${!mon_tableau[*]}
0 1 2 3
greg@localhost:~/$ echo ${#mon_tableau[@]}
4

On peut remarquer plusieurs choses utiles :
- afficher la variable du tableau retourne la valeur du premier élément du tableau.
- on affiche les différents éléments à partir de leur index dans le tableau, le shell ne permet donc pas de créer des «hash» ou tableaux associatifs.
- Il existe deux manières de récupérer le nombre d'éléments d'un tableau ou ses index avec les cactères spéciaux «*» et/ou «@». Nous verrons en quoi ces 2 caractères sont différents un peu plus loin.

Ajouter, effacer des valeurs d'un tableau:
greg@localhost:~/$ mon_tableau[5]=six
greg@localhost:~/$ echo ${!mon_tableau[*]}
0 1 2 3 5
greg@localhost:~/$ unset mon_tableau[0]
greg@localhost:~/$ echo $mon_tableau

greg@localhost:~/$ echo ${!mon_tableau[*]}
1 2 3 5
greg@localhost:~/$ unset mon_tableau
greg@localhost:~/$ echo ${!mon_tableau[*]}

greg@localhost:~/$ _


Il existe  deux moyens faciles de parcourir les tableaux en shell avec un for :

greg@localhost:~/$ for index in "${!mon_tableau[@]}"; do echo ${mon_tableau[$index]}; done
un
deux
trois
quatre
greg@localhost:~/$ for elt in "${mon_tableau[@]}"; do echo $elt;done
un
deux
trois
quatre
greg@localhost:~/$ for elt in "${mon_tableau[*]}"; do echo $elt;done
un deux trois quatre

Et là, nous voyons bien la différence entre le «*» et le «@». L'arobase nous retourne la liste des éléments du tableau alors que le «*» nous retourne le contenu du tableau dans une seule chaîne. Pour calculer les indexes et le nombre d'élements d'un tableau, cela ne fais pas vraiment de différence mais dès qu'il s'agit de parcourir le tableau la différence est de taille.

Un tableau particulier : $
Ce tableau est un tableau spécial du shell, il contient les paramètres passés au shell courant. Nous pouvons ainsi facilement capter des modifieurs passés en arguments au script pour influer sur son comportement.

Imaginons le script script.sh qui contient le texte suivant :
#!/bin/bash
for arg in "$@"
do
  echo $arg
done

Rendons le exécutable et lançons le :
greg@localhost:~/$ chmod +x script.sh
greg@localhost:~/$ ./script.sh
greg@localhost:~/$ ./script.sh un deux trois
un
deux
trois

Changeons maintenant notre code en remplaçant le «@» par «*». Notre script devient :
#!/bin/bash
for arg in "$*"
do
  echo $arg
done


Lançons le:
greg@localhost:~/$ ./script.sh un deux trois
un deux trois

Voila ... bon week end !
Publicité

Publié dans geekblog

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
Z
<br /> <br /> C'est parfait ça explique de façon claire tout ce que je voulais savoir sur les tableaux en shell<br /> <br /> <br />  <br /> <br /> <br /> merci beaucoup<br /> <br /> <br /> <br />
Répondre
F
il y a une erreur la taille d'un tableau:echo ${#mon_tableau} et non pas echo ${#mon_tableau[@]}
Répondre
G
<br /> <br /> heu ...<br /> greg@sensiolabs112:~$ mon_tableau=(un deux trois quatre)<br /> greg@sensiolabs112:~$ echo ${#mon_tableau}<br /> 2<br /> greg@sensiolabs112:~$ echo ${#mon_tableau[@]}<br /> 4<br /> <br /> Je ne sais pas ce qu'est ${#mon_tableau} mais cela ne semble pas être la longueur de mon tableau.<br /> <br /> <br /> <br />
G
Il semblerait que l'expansion ${!mon_tableau[*]} soit assez récente en shell. Elle ne marche pas par exemple avec un bash-2.0.5.
Répondre