#1 Le 18/02/2009, à 19:34
- rototo
bash: boucle for sur variable à plusieurs elements
Bonjour
j'ai un probleme de débutant en bash
une variable contenant plusieurs éléments traitée par une boucle for jusqu'à la c'est ok, mais je voudrai que la lecture de la boucle s'effectue par le dernier éléments pour finir par le premier.
une idée
merci a tous
Daniel parce qu’il le Prévost bien !
Hors ligne
#2 Le 18/02/2009, à 20:00
- genma
Re : bash: boucle for sur variable à plusieurs elements
Une boucle se fait de généralement sous la forme for (i=0, i<10, i++)
Et ca monte
Si tu veux en décrémentant, tu fais un for (i=10, i<0, i--), tu mets donc des moins pour descendre.
A adapter à ton cas et au langage.
"Lorsque tu as découvert le libre, tu sais que tu ne pourras plus jamais revenir en arrière".
Utilisateur d'Ubuntu depuis la version 4.10 !
Mon blog ? https://blog.genma.fr
Mon twitter? http://twitter.com/genma
Hors ligne
#3 Le 18/02/2009, à 20:08
- Totor
Re : bash: boucle for sur variable à plusieurs elements
Bonsoir,
Peux-tu être plus précis ?
Tu as tout dans une seule variable mais quel est le caractère séparateur te permettant d'identifier tes valeurs ?
Supposons que ce soit un espace :
#!/bin/bash
[ ton traitement amont de valorisation de ta variable MA_VARIABLE ]
# création d'un tableau
TABLEAU=(${MA_VARIABLE})
for((idx=$((${#TABLEAU[@]}-1));idx>=0;idx--))
do
element="${TABLEAU[${idx}]}"
...
done
Si ton caractère séparateur n'est pas un espace, alors il te faudra modifier la variable IFS.
Ex avec le caractère ;
#!/bin/bash
[ ton traitement amont de valorisation de ta variable MA_VARIABLE ]
# création d'un tableau
oldIFS="${IFS}"
IFS=';'
TABLEAU=(${MA_VARIABLE})
IFS="${oldIFS}"
for((idx=$((${#TABLEAU[@]}-1));idx>=0;idx--))
do
element="${TABLEAU[${idx}]}"
...
done
-- Lucid Lynx --
Hors ligne
#4 Le 18/02/2009, à 20:09
- quimporte
Re : bash: boucle for sur variable à plusieurs elements
Si tu parles d'une variable tableau, peut-être comme ça :
var=(a b c)
for((i=${#var[*]}-1;i>=0;i--)) ; do echo "${var[i]}" ; done
ça devrait donner :
c
b
a
#5 Le 18/02/2009, à 20:39
- Totor
Re : bash: boucle for sur variable à plusieurs elements
Si tu parles d'une variable tableau, peut-être comme ça :
var=(a b c) for((i=${#var[*]}-1;i>=0;i--)) ; do echo "${var[i]}" ; done
ça devrait donner :
c
b
a
encore sur la même ligne
-- Lucid Lynx --
Hors ligne
#6 Le 18/02/2009, à 23:01
- quimporte
Re : bash: boucle for sur variable à plusieurs elements
ah désolé, j'ai posté mon message avant de lire le tien.
Pour excuser la redondance, voici une méthode plus fiable que la précédente :
echo "${!var[*]}" | tr ' ' '\n' | sort -nr | while read i ; do echo "${var[i]}" ; done
qui fonctionne même s'il y a des "trous" dans le tableau (nombres non consécutifs)
#7 Le 19/02/2009, à 08:31
- quimporte
Re : bash: boucle for sur variable à plusieurs elements
pas pensé hier, mais on peut utiliser "tac" aussi pour renverser l'ordre, plus rapide que "sort" :
printf "${!var[*]} " | tac -s' ' | while read -d' ' i ; do echo "${var[i]}" ; done
attention à bien mettre l'espace entre } et "
#8 Le 19/02/2009, à 10:31
- Totor
Re : bash: boucle for sur variable à plusieurs elements
pas pensé hier, mais on peut utiliser "tac" aussi pour renverser l'ordre, plus rapide que "sort" [...]
je ne connaissais pas tac. Seulement rev mais qui ne répond pas au besoin.
-- Lucid Lynx --
Hors ligne
#9 Le 19/02/2009, à 13:20
- rototo
Re : bash: boucle for sur variable à plusieurs elements
Merci pour toutes vos réponses
Vu la qualité de vos connaissances en la matière, je n'ose vous montrer ce que j'ai pondu laborieusement
mais bon je me lance
#!/bin/bash
# Supression complete de compiz-fusion via les git
color()
{
printf '\033[%sm%s\033[m\n' "$@"
}
clear
progs="compiz bcop libcompizconfig compizconfig-python compizconfig-backend-gconf emerald emerald-themes i18n plugins-extra plugins-main plugins-unsupported animationaddon ccsm simple-ccsm 3d addhelper anaglyph animation atlantis2 basicblur bicubic cf-greenscreen cf-squeeze cf-windowlist colorfilter colorfilters compiz-menu compiz-scheme crashhandler cubeaddon cubecaps cubedbus cubemodel desktopclick dialog dodge elements expo extra-animations extrawm ezoom fadedesktop fakeargb fireflies firepaint flash freewins fusion-icon gears ghost grid group jpeg lazypointer loginout mag maximumize mblur mousegestures mousepoll mousetrails mswitch neg newton notification opacify peek photowheel prompt put putplus reflex resizeinfo ring rubik scaleaddon scalefilter screensaver session shadows shelf shift showdesktop showmouse showrepaint simple-animations smartput snap snow snowglobe splash springdesk stackswitch stars staticswitcher swap text throw thumbnail tile toggle-decoration trailfocus vigo visualevent vpswitch wall wallpaper widget winrules workarounds workspacenames"for prog in $progs
do
cd /home/rototo/compiz/$prog
echo -e `color 31 "Supression de"` `color 32 " - $prog -"`
if [[ `ls | grep setup.py` ]]
then
sudo python setup.py uninstall
else
sudo make uninstall
fi
cd /home/rototo/compiz
sudo rm -R $prog
done
voilas, c'est fait, ne soyez pas avare de commentaires et autres critiques, je suis preneur
Je voudrais que la boucle commence par workspacenames pour finir par compiz
Merci a tous
rototo
Dernière modification par rototo (Le 19/02/2009, à 13:22)
Daniel parce qu’il le Prévost bien !
Hors ligne
#10 Le 23/02/2009, à 13:14
- rototo
Re : bash: boucle for sur variable à plusieurs elements
:D:D
:D:D
:D:D
Dernière modification par rototo (Le 23/02/2009, à 13:19)
Daniel parce qu’il le Prévost bien !
Hors ligne
#11 Le 13/05/2009, à 09:49
- Euskaral
Re : bash: boucle for sur variable à plusieurs elements
quimporte a écrit :Si tu parles d'une variable tableau, peut-être comme ça :
var=(a b c) for((i=${#var[*]}-1;i>=0;i--)) ; do echo "${var[i]}" ; done
ça devrait donner :
c
b
aencore sur la même ligne
Je viens de le faire, cela affiche bien ligne par ligne le tableau, de la fin au début.
merci à propos
Hors ligne
#12 Le 13/05/2009, à 13:45
- Totor
Re : bash: boucle for sur variable à plusieurs elements
Totor a écrit :encore sur la même ligne
Je viens de le faire, cela affiche bien ligne par ligne le tableau, de la fin au début.
merci à propos
Le "encore sur la même ligne" ne faisait pas référence au script fourni par quimporte mais au fait que nous fournissions les même solutions sur plusieurs posts.
-- Lucid Lynx --
Hors ligne
#13 Le 18/02/2012, à 18:39
- cracolinux
Re : bash: boucle for sur variable à plusieurs elements
Je galère souvent avec cette boucle (ça vient de m'arriver à l'instant, et c'est comme ça que je suis tombé sur cette discussion).
Voici donc un petit truc mnémotechnique que je viens de trouver et qui rendra peut-être service :
Il suffit de penser que la programmation en bash script, c'est la GUERRE mon colonel !!
La boucle se fait ainsi :
for ((a=1;a<10;a++)) , donc avec for (fort) avec a=1 et tant que (tank) a<10, on incrémente a de 1 (a=a+1)
do
...
done
Hors ligne
#14 Le 03/08/2012, à 13:51
- lapin0u
Re : bash: boucle for sur variable à plusieurs elements
Je galère souvent avec cette boucle (ça vient de m'arriver à l'instant, et c'est comme ça que je suis tombé sur cette discussion).
Voici donc un petit truc mnémotechnique que je viens de trouver et qui rendra peut-être service :
Il suffit de penser que la programmation en bash script, c'est la GUERRE mon colonel !!
http://pix.toile-libre.org/upload/img/1329586535.jpgLa boucle se fait ainsi :
for ((a=1;a<10;a++)) , donc avec for (fort) avec a=1 et tant que (tank) a<10, on incrémente a de 1 (a=a+1)
do
...
done
![]()
![]()
![]()
Par contre en cas de guerre, on manque souvent d'informations et donc par la même de la taille du tableau et donc au lieu de partir sur un for complexe, bash a pensé à vous avec la commande suivante
#!/bin/sh
tableau=("pouet" "pouet2" "pouet3")
for element in ${tableau[@]}
do
echo $element
done
C'était pas ma guerre
Hors ligne
#15 Le 03/08/2012, à 22:21
- cracolinux
Re : bash: boucle for sur variable à plusieurs elements
J'pouvais tous les tuer. Toi aussi j'pouvais te tuer. En VIM tu fais la loi, mais ici c'est moi. Alors fais pas chier. Me fais pas chier ou j'te ferais une guerre comme t'en as jamais vu ! Laisse tomber. Laisse tomber...
Hors ligne