Tableaux Bash

Voici une traduction des " Bash Arrays " de Mitch Frazier sur linuxjournal.com.



Si vous utilisez le shell "standard" * NIX, il se peut que vous ne soyez pas familier avec la fonction bash utile des tableaux. Bien que les tableaux de bash ne soient pas aussi cool que ceux des langages P (Perl, Python et PHP) et d'autres langages de programmation, ils sont souvent utiles.

Les tableaux Bash n'ont que des index numériques, mais ils sont facultatifs, ce qui signifie que vous n'avez pas à définir explicitement les valeurs de tous les index. Un tableau entier peut être défini en plaçant les entrées entre parenthèses:



  arr=(Hello World)


Les enregistrements individuels peuvent être définis en utilisant la syntaxe familière (de BASIC (pardonnez-moi Dijkstra - note du traducteur) à Fortran):



  arr[0]=Hello
  arr[1]=World




Cependant, le contraire semble comparativement plus laid. Si vous avez besoin de vous référer à une entrée spécifique, alors:



  echo ${arr[0]} ${arr[1]}


À partir de la page de manuel:



« Les accolades sont nécessaires pour éviter les conflits lors du développement des chemins d'accès complets aux fichiers. »



De plus, les constructions étranges suivantes sont disponibles:



  ${arr[*]} #    
  ${!arr[*]}#    
  ${#arr[*]}#    
  ${#arr[0]}#    (  )


$ {! arr [*]} est un ajout relativement récent à bash et ne fait pas partie de l'implémentation d'origine. La construction suivante montre un exemple d'utilisation simple d'un tableau. Remarquez le "[index] = valeur", cela vous permet d'attribuer une valeur spécifique à un numéro d'enregistrement spécifique.



#!/bin/bash

array=(one two three four [5]=five)

echo "Array size: ${#array[*]}"  #   

echo "Array items:" #   
for item in ${array[*]}
do
    printf "   %s\n" $item
done

echo "Array indexes:" #   
for index in ${!array[*]}
do
    printf "   %d\n" $index
done

echo "Array items and indexes:" #      
for index in ${!array[*]}
do
    printf "%4d: %s\n" $index ${array[$index]}
done


L'exécution du script générera la sortie suivante:



Taille du tableau: 5



Éléments du tableau:



un

deux

trois

quatre

cinq



Index du tableau:



0

1

2

3

5



Éléments du tableau et index:



0: un

1: deux

2: trois

3: quatre

5: cinq



Notez que le caractère "@" peut être utilisé à la place de "*" dans des constructions comme {arr [*]}, le résultat sera le même sauf pour le développement de l'entrée entre guillemets. "$ *" et "$ @" renverront les entrées entre guillemets, "$ {arr [*]}" renverra chaque entrée sous forme d'un mot, "$ {arr [@]}" renverra chaque entrée sous forme de mots séparés.



L'exemple suivant montre comment les guillemets et les constructions sans guillemets renvoient des chaînes (particulièrement important lorsque ces chaînes contiennent des espaces):



#!/bin/bash

array=("first item" "second item" "third" "item")

echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
    printf "   %s\n" "${array[$ix]}"
done
echo

arr=(${array[*]})
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[*]}")
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[@]}")
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done


Sortie au démarrage:



Nombre d'éléments dans le tableau d'origine: 4



premier élément

deuxième élément

troisième

élément



Après l'expansion non citée : 6



premier

élément

deuxième

élément

troisième

élément



Après * extension citée: 1



premier élément deuxième élément troisième élément



Après @ expansion citée: 4



premier élément

deuxième élément élément

troisième

élément



All Articles