Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/02/2009, à 20: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 big_smile

merci a tous


Daniel parce qu’il le Prévost bien !

Hors ligne

#2 Le 18/02/2009, à 21: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, à 21: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, à 21: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, à 21:39

Totor

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
a

encore sur la même ligne wink


-- Lucid Lynx --

Hors ligne

#6 Le 19/02/2009, à 00: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, à 09: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, à 11:31

Totor

Re : bash: boucle for sur variable à plusieurs elements

quimporte a écrit :

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, à 14: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 big_smile
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, à 14:22)


Daniel parce qu’il le Prévost bien !

Hors ligne

#10 Le 23/02/2009, à 14:14

rototo

Re : bash: boucle for sur variable à plusieurs elements

lol      big_smile       big_smile:D:D
big_smile      big_smile       big_smile     big_smile
big_smile      big_smile       big_smile     big_smile
big_smile      big_smile       big_smile:D:D
big_smile      big_smile       big_smile
  big_smile:D:D        big_smile

Dernière modification par rototo (Le 23/02/2009, à 14:19)


Daniel parce qu’il le Prévost bien !

Hors ligne

#11 Le 13/05/2009, à 10:49

Euskaral

Re : bash: boucle for sur variable à plusieurs elements

Totor a écrit :
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
a

encore sur la même ligne wink

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, à 14:45

Totor

Re : bash: boucle for sur variable à plusieurs elements

Euskaral a écrit :
Totor a écrit :

encore sur la même ligne wink

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, à 19: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 !!
1329586535.jpg

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

big_smile  smile  tongue lol


Pixup : postez vos images vite et bien - Wificheck : Aidez nous à vous aider

« Ne devenez jamais pessimiste. Un pessimiste a plus souvent raison qu'un optimiste, mais l'optimiste s'amuse plus — et aucun des deux ne peut arrêter la marche du monde. » R.Heinlein

Hors ligne

#14 Le 03/08/2012, à 14:51

lapin0u

Re : bash: boucle for sur variable à plusieurs elements

cracolinux a écrit :

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.jpg

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

big_smile  smile  tongue lol

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, à 23:21

cracolinux

Re : bash: boucle for sur variable à plusieurs elements

1344028790.jpg

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


Pixup : postez vos images vite et bien - Wificheck : Aidez nous à vous aider

« Ne devenez jamais pessimiste. Un pessimiste a plus souvent raison qu'un optimiste, mais l'optimiste s'amuse plus — et aucun des deux ne peut arrêter la marche du monde. » R.Heinlein

Hors ligne