Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

mercredi 18 octobre 2017

Bien utiliser les tableaux en bash: les tableaux associatifs

Dans un billet précédent, on a vu comment bien utiliser les tableaux en bash. Il s'agissait des tableaux indexés dont l'indice est un entier comme dans beaucoup de langages.

Mais Bash permet aussi la définition de tableaux associatifs dans lesquels l'indice est une chaîne de caractères et non plus un entier.

Pour reprendre l'exemple des couleurs:

declare -A colours

colours[black]=noir
colours[red]=rouge
colours[green]=vert

Vous remarquerez le flag -A au lieu de -a utilisé pour le tableau indexé.

Pour lister les valeurs du tableau associatif:

for colour in "${colours[@]}"; do
    echo "$colour"
done
rouge
vert
noir

Maintenant si je veux faire le parcours en partant des clés:

for colour in "${!colours[@]}"; do
    echo "$colour: ${colours[$colour]}"
done

Ce qui donne:

red: rouge
green: vert
black: noir

La syntaxe est donc exactement la même qu'avec les tableaux indexés excepté qu'ici la clé est une chaîne de caractères et que l'utilisation des crochets tient lieu de double quotes: la clé peut donc contenir des espaces.

On peut aussi affecter un tableau en une seule instruction:

data=([joe]=30 [mary]=25)

vendredi 7 avril 2017

Bien utiliser les tableaux en bash: les tableaux indexés

Le bash, Bourne Again Shell, offre une possibilité absente du Bourne Shell, à savoir la possibilité de déclarer facilement des tableaux.

On s'intéressera ici aux tableaux indexés uniquement.

Pour déclarer un tableau, rien de plus simple:

#!/bin/bash

declare -a colours
colours=(black blue green white red yellow)

Le mot clé "declare" avec le flag -a, bien que facultatif, précise que la variable colours est un tableau indexé.

Maintenant pour afficher tous les éléments en une fois:

echo "colours_elements=${colours[@]}"

colours_elements=black blue green white red yellow

Pour afficher la troisième couleur, située à l'indice 2:

echo "green=${colours[2]}"
green=green

Le nombre d'élements du tableau:

echo "colours_count=${#colours[@]}"
colours_count=6

Pour boucler sur chaque valeur:

for colour in "${colours[@]}"; do
    ...
done

Et pour afficher la troisième couleur en partant de la fin du tableau:

echo "${colours[-3]}"
white

Enfin bash permet aussi de lire un fichier dans un tableau avec la built-in mapfile.

samedi 8 août 2015

Attention aux built-in et aux variables spécifiques à bash

On lit ça et là que pour vérifier si l'utilisateur courant est root il faut utiliser la variable UID ou EUID en procédant comme suit:

if [ $EUID -ne 0 ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

malheureusement en omettant de préciser que ces variables sont spécifiques à bash et donc utilisable à condition d'avoir bash sur la machine et d'avoir explicitement demandé à l'utiliser.

En effet, depuis que la plupart des environnements Linux ont bash comme Shell par défaut, les développeurs semblent vouloir écrire chaque script forcément en bash. Cette intention est louable pour profiter de la puissance de ce Shell, mais rendra le script inutilisable dans un environnement dépourvu de bash et/ou si le Shebang n'est pas positionné correctement.

Par conséquent, si l'on souhaite écrire des scripts Shells portables, il faut bien prêter attention aux built-in et variables de bash qui seraient absentes sur sh.

- page 1 de 2