Bash: Inverser l'ordre d'un tableau

Bonjour à tous

La question de Pat66, ici:

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. :wink:

#!/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)

1 J'aime

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:

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
1 J'aime

Bonjour

#!/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[@]}

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.

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)?

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.