# Bash: Inverser l'ordre d'un tableau

**URL:** <https://www.debian-fr.org/t/bash-inverser-lordre-dun-tableau/87069>\
**Category:** Programmation\
**Created:** [Août 31, 2022, 1:44 UTC](https://www.debian-fr.org/t/bash-inverser-lordre-dun-tableau/87069 "2022-08-31T13:44:57Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Août 31, 2022, 1:44 UTC](https://www.debian-fr.org/t/bash-inverser-lordre-dun-tableau/87069/1 "2022-08-31T13:44:58Z")

</div>

Bonjour à tous

La question de Pat66, ici:

> [@Inversion d elements dans un tableau](https://www.debian-fr.org/t/inversion-d-elements-dans-un-tableau/86725):
>
> Bonjour Je dois ecrire une fonction qui inverse l ordre des elements d’un tableau d entiers prototypee de la sorte void ft\_rev\_int\_tab (int \*tab,int size); le probleme est la realisation de l inversion des elements . Merci pour vos eventuels explications.Je precise c est en C.

concernant le _C_  
m’a donné envie de la résoudre en _bash_.

Je ne suis pas programmeur, très loin s’en faut! mais je me débrouille plus ou moins mal avec _bash_ pour créer des petits scripts bricolés.

Je propose cette solution, et ne me vexerait pas de toutes vos remarques plus ou moins constructives. 😉

```
#!/bin/bash --
# Inverser l'ordre des éléments d'un tableau.
# Il s'agit de tableaux indicés (les tableaux associatifs ne sont pas spontanément ordonnés)
#echo "Il s'agit de tableaux indicés (les tableaux associatifs ne sont pas ordonnés)"
declare x=''
declare -a tableau=( prem deux trois etc. cinquieme )
declare -a nouv
tableau[3]='quatrieme'
tableau[7]='Huitieme'
# Trouver l'indice le plus élevé (ici: 7, le 8e):
for i in ${!tableau[*]}
do
 # écraser tous les indices par le suivant, jusqu'au dernier:
  x="$i"
done
unset i
# Création du tableau inversé:
for i in ${tableau[*]}
do
  nouv[x]="$i"
  let x--
done
echo "Tableau initial: ${tableau[*]}"
echo "Nouveau tableau: ${nouv[*]}"

```

(Quelques fioritures inutiles ne sont là que pour mon aide-pauvre-mémoire)

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Septembre 1, 2022, 8:24 UTC](https://www.debian-fr.org/t/bash-inverser-lordre-dun-tableau/87069/2 "2022-09-01T08:24:55Z")

</div>

Avec les tableaux tu peux utiliser `${#tableau[@]}` pour connaître le nombre d’éléments du tableau, et ainsi le parcourir en ordre inverse avec `seq` par exemple:

```auto
sputnik@debian:~$ cat tableau.sh
#!/bin/bash

tableau=("un" "deux" "trois" "quatre" "cinquante-six" "cent huit")

for i in $(seq ${#tableau[@]} -1 0) ; do
        echo "${tableau[${i}]}"
done
sputnik@debian:~$ ./tableau.sh

cent huit
cinquante-six
quatre
trois
deux
un

```

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Septembre 1, 2022, 11:25 UTC](https://www.debian-fr.org/t/bash-inverser-lordre-dun-tableau/87069/3 "2022-09-01T11:25:14Z")

</div>

Bonjour

```nohighlight
#!/bin/bash

declare -a tabl=( {a..z} )
echo ${tabl[@]}

premier=0
dernier=${#tabl[@]}

while (( premier <= dernier )); do
  temp="${tabl[$premier]}"
  tabl[$premier]="${tabl[$dernier]}"
  tabl[$dernier]="$temp"
  ((premier++))
  ((dernier--))
done

echo ${tabl[@]}

```

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Septembre 1, 2022, 2:27 UTC](https://www.debian-fr.org/t/bash-inverser-lordre-dun-tableau/87069/4 "2022-09-01T14:27:56Z")

</div>

Dans mon exemple, j’ai utilisé un tableau à 2 trous: avec la commande:  
`tableau[7]='Huitieme'` alors que tableau ne comprend que 5 éléments (de 0 à 4).  
C’est pourquoi la syntaxe `${#tableau[@]}` n’est pas juste dans ce cas de figure.  
Désolé, j’aurais du souligner cette ligne.

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Septembre 1, 2022, 2:32 UTC](https://www.debian-fr.org/t/bash-inverser-lordre-dun-tableau/87069/5 "2022-09-01T14:32:30Z")

</div>

Merci pour cette transposition de la boucle for en boucle while avec laquelle je suis moins familier.

Est-ce qu’on peut savoir par avance les avantages éventuels de l’une ou l’autre de ces syntaxes quand à l’efficacité, la rapidité (par exemple en cas de très gros tableau)?

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Septembre 1, 2022, 3:06 UTC](https://www.debian-fr.org/t/bash-inverser-lordre-dun-tableau/87069/6 "2022-09-01T15:06:29Z")

</div>

Dans le message #1 de josephtux

la première proposition créé un deuxième tableau tout en gardant le tableau original en l’état.  
Donc, si le tableau occupe 10Ko de RAM, il en faudra 10 de plus pour créer le deuxième tableu,

Mais dans le cas où il fallait garder le tableau original dans l’état où il était,  
et créer un deuxième tableau contenant les mêmes valeurs mais dans l’ordre inverse,  
on est bien obligé de faire comme ça.

=======  
Dans le message #2 de Sputnik93  
chaque élément est envoyé sur le flux de sortie standard dans l’ordre inverse de celui du tableau.  
Là aussi, le tableau original reste inchangé, et il n’y a pas de nouveau tableau créé  
ce qui n’empêche pas, si besoin, de rediriger la sortie du script vers la création du tableau dont l’ordre sera inversé.

=======  
Dans mon précédent message, je modifie le tableau original  
en utilisant un élément temporaire pour changer l’ordre des valeurs du tableau original

=======  
En fait il n’y en a pas une qui soit meilleure que l’autre,  
puisque tout va dépendre de ce qu’on voudra faire avec ce script  
et dans quelles conditions.
