Sysop.Fr
Catégories

apache

awk

bash

charmap

date

echo

encoding

find

grep

hexdump

irc

iso3166

ls

mysql

od

openssh

printf

python

read

sed

seq

smpp

sort/uniq

tar

tr

ucp

Articles

bash - utilisation des tableaux

1. Déclarer un tableau:

1.1 Déclarer un tableau indicé (liste):

root@ubuntu:~# declare -a list_distro

root@ubuntu:~# declare -a list_distro=("Ubuntu" "Debian" "Red hat")

ou

root@ubuntu:~# list_distro=()

root@ubuntu:~# list_distro=("Ubuntu" "Debian" "Red hat")

Les indices seront assignés automatiquement et séquentiellement.
            

1.2 Déclarer un tableau associatif:

root@ubuntu:~# declare -A array_translate

root@ubuntu:~# declare -A array_translate=(['un']="one" ['deux']="two" ['trois']="three" ['quatre']="four")
            

2. Convertir une chaîne en tableau:

root@ubuntu:~# animaux="chat chien lapin"

root@ubuntu:~# list_animaux=( ${animaux// / } )
root@ubuntu:~# echo ${list_animaux[@]}
chat chien lapin

root@ubuntu:~# jours="lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche"

root@ubuntu:~# list_jours=( ${jours//,/ } )
root@ubuntu:~# echo ${list_jours[@]}
lundi mardi mercredi jeudi vendredi samedi dimanche

root@ubuntu:~# lettres="a|z|e|r|t|y"

root@ubuntu:~# list_lettres=( ${lettres//|/ } )
root@ubuntu:~# echo ${list_lettres[@]}
a z e r t y
            

3. Convertir un tableau en chaîne:

### define array
array_file=()
array_file=("file1" "file2" "file3" "file4")

### list array values
for file_name in "${array_file[@]}"; do
    echo "file_name=\"${file_name}\""
done

### join array to string with space separator
file_name_string=$( printf "%s.txt " "${array_file[@]}" )

### remove last space from string
file_name_string=${file_name_string%?}

echo "file_name_string=\"${file_name_string}\""

file_name="file1"
file_name="file2"
file_name="file3"
file_name="file4"
file_name_string="file1.txt file2.txt file3.txt file4.txt"
            

4. Taille d'un tableau: ${#nom_du_tableau[@]}

root@ubuntu:~# echo ${#list_distro[@]}
3

root@ubuntu:~# echo ${#array_translate[@]}
4
            

5. Indices d'un tableau: ${!nom_du_tableau[@]}

root@ubuntu:~# echo ${!list_distro[@]}
0 1 2

root@ubuntu:~# echo ${!array_translate[@]}
un deux trois quatre
            

6. Parcours d'un tableau: ${nom_du_tableau[@]}

root@ubuntu:~# echo ${list_distro[@]}
Ubuntu Debian Red hat

root@ubuntu:~# echo ${array_translate[@]}
one two three four

root@ubuntu:~# for (( i=0; i<${#list_distro[@]}; i++ )); do
    echo "$i=${list_distro[$i]}"
done
0=Ubuntu
1=Debian
2=Red hat

root@ubuntu:~# for distro in "${list_distro[@]}"; do
    echo "distro=${distro}"
done
distro=Ubuntu
distro=Debian
distro=Red hat

root@ubuntu:~# for key in ${!array_translate[@]}; do
    echo "$key=${array_translate[$key]}"
done
un=one
deux=two
trois=three
quatre=four
            

7. Extraire les valeurs d'un tableau: ${nom_du_tableau[indice]}

7.1 Extraire la valeur à l'indice 1:

root@ubuntu:~# echo ${list_distro[1]}
Debian
            

7.2 Extraire les 3 premiers caractères de la valeur à l'indice 1:

root@ubuntu:~# echo ${list_distro[1]:0:3}
Deb
            

7.3 Extraire toutes les valeurs à partir l'indice 1:

root@ubuntu:~# echo ${list_distro[@]:1}
Debian Red hat
            

7.4 Extraire 2 valeurs à partir l'indice 0:

root@ubuntu:~# echo ${list_distro[@]:0:2}
Ubuntu Debian
            

7.5 Extraire une valeur d'un tableau associatif:

root@ubuntu:~# echo ${array_translate['trois']}
three
            

7.6 Extraire une valeur aléatoire d'un tableau:

Obtenir la taille du tableau:
root@ubuntu:~# range=${#list_distro[@]}

Obtenir un indice aléatoire (http://tldp.org/LDP/abs/html/randomvar.html):
root@ubuntu:~# list_idx_random=${RANDOM}
root@ubuntu:~# echo ${list_idx_random}
27772

Reduire cet indice aléatoire à la taille du tableau:
root@ubuntu:~# let "list_idx_random %= ${range}"
root@ubuntu:~# echo ${list_idx_random}
1

Extraire la valeur de l'indice aléatoire:
root@ubuntu:~# echo ${list_distro[${list_idx_random}]}
Debian
            

8. Modifier une valeur d'un tableau:

root@ubuntu:~# list_distro[2]="OpenBSD"

root@ubuntu:~# echo ${list_distro[@]}
Ubuntu Debian OpenBSD
            

9. Taille d'une valeur d'un tableau: ${#nom_du_tableau[indice]}

root@ubuntu:~# echo ${list_distro[0]} ${#list_distro[0]}
Ubuntu 6
            

10. Ajouter des éléments à la fin d'un tableau:

root@ubuntu:~# list_distro=( "${list_distro[@]}" "AIX" "HP-UX" )

root@ubuntu:~# echo ${list_distro[@]}
Ubuntu Debian OpenBSD AIX HP-UX
            

11. Ajouter des éléments au début d'un tableau:

root@ubuntu:~# list_distro=( "FreeBSD" "${list_distro[@]}" )

root@ubuntu:~# echo ${list_distro[@]}
FreeBSD Ubuntu Debian OpenBSD AIX HP-UX
            

12. Copier un tableau identique à l'original:

root@ubuntu:~# list_new_distro=( "${list_distro[@]}" )

root@ubuntu:~# echo ${list_new_distro[@]}
FreeBSD Ubuntu Debian OpenBSD AIX HP-UX
            

13. Copier un tableau avec modification:

13.1 Copier un tableau sans la ou les valeur(s) contenant AI*:

root@ubuntu:~# list_updated_distro=( "${list_distro[@]/AI*/}" )
            
root@ubuntu:~# echo ${list_updated_distro[@]}
FreeBSD Ubuntu Debian OpenBSD HP-UX
            

13.2 Copier un tableau en modifiant la ou les valeur(s) contenant "HP-UX" par "Gentoo":

root@ubuntu:~# list_final_distro=( ${list_distro[@]/HP-UX/Gentoo} )

root@ubuntu:~# echo ${list_final_distro[@]}
FreeBSD Ubuntu Debian OpenBSD AIX Gentoo
            

14. Supprimer un élément d'un tableau: unset nom_du_tableau[indice]

root@ubuntu:~# unset list_distro[4]

L'indice ET la valeur ont été supprimés du tableau:
root@ubuntu:~# echo ${!list_distro[@]}
0 1 2 3 5

root@ubuntu:~# echo ${list_distro[@]}
FreeBSD Ubuntu Debian OpenBSD HP-UX

Pour ré-ordoner les indices du tableau:
root@ubuntu:~# list_distro=( "${list_distro[@]}" )

root@ubuntu:~# echo ${!list_distro[@]}
0 1 2 3 4

root@ubuntu:~# echo ${list_distro[@]}
FreeBSD Ubuntu Debian OpenBSD HP-UX
            

15. Supprimer un tableau entier: unset nom_du_tableau[@]

root@ubuntu:~# unset list_distro
root@ubuntu:~# unset list_distro[@]
root@ubuntu:~# unset list_distro[*]