OVH Cloud OVH Cloud

[bash] probleme de substitution

13 réponses
Avatar
George Abitbol
Bonjour,

je voudrais faire un truc du genre

for i in "1 2 3 4 5 6" ;
do
echo ${$i} # <-- ici ca va pas
done

bref dans un for je veux pouvoir travailler avec les parametres de ma
commande en bouclant sur leur place. Le probleme c'est que j'arrive pas
a faire un truc correct, je me prends des erreurs de substitution.

Est-ce que quelqu'un saurait comment je dois m'y prendre ?

pour info :
$ bash --version
GNU bash, version 3.1.17(9)-release (i686-pc-cygwin)
Copyright (C) 2005 Free Software Foundation, Inc.

Merci d'avance

10 réponses

1 2
Avatar
Sébastien Monbrun aka TiChou
Dans le message
<news:,
*George Abitbol* tapota sur f.c.o.l.configuration :

Bonjour,

for i in "1 2 3 4 5 6" ;


for ((i=1; i<=6; i++))

do
echo ${$i} # <-- ici ca va pas


Que cherchez-vous à faire ? echo $i ?

done

bref dans un for je veux pouvoir travailler avec les parametres de ma
commande en bouclant sur leur place.


Soyez plus précis et concret.

--
Sébastien Monbrun aka TiChou

Avatar
George Abitbol

for ((i=1; i<=6; i++))

do
echo ${$i} # <-- ici ca va pas


Que cherchez-vous à faire ? echo $i ?


Non, je chercher à faire
echo $1
echo $2
...
echo $6

Soyez plus précis et concret.


c'est moins chaleureux qu'avant ici... )':


Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:,
*George Abitbol* tapota sur f.c.o.l.configuration :

for ((i=1; i<=6; i++))

do
echo ${$i} # <-- ici ca va pas


Que cherchez-vous à faire ? echo $i ?


Non, je chercher à faire
echo $1
echo $2
...
echo $6


eval echo $$i

Soyez plus précis et concret.


c'est moins chaleureux qu'avant ici... )':


Vous dites ça parce que je suis (pour l'instant) le seul à avoir pris la
peine de comprendre ce que vous vouliez faire pour vous aider ?

--
Sébastien Monbrun aka TiChou



Avatar
George Abitbol

echo $1
echo $2
...
echo $6


eval echo $$i


(o:

Soyez plus précis et concret.


c'est moins chaleureux qu'avant ici... )':


Vous dites ça parce que je suis (pour l'instant) le seul à avoir pris la
peine de comprendre ce que vous vouliez faire pour vous aider ?


non, juste pour le ton général plutôt froid de la réponse
(concision, impératif, vouvoiement (même si ça c'est un point qont
je me souvenais)).

Par contre merci pour la réponse, ça marche impeccable (non pas que
j'en doutais, hein).

--



Avatar
George Abitbol
[snip]

bon, je vais surement passer pour un boulet, mais tant pis : mon
script, qui s'appelle blah, contient ça :
#!/bin/bash

for (( i=1 ; i <= $# ; i++ )) ;
do
eval echo $$i
toto=`eval echo $$i`
echo $toto
done

------------------------------------------

quand je le lance, j'ai ça :
$ ./blah toto tata titi
toto
4304i
tata
4304i
titi
4304i

------------------------------------------

Question : comment je récupère le résultat de l'eval dans une
variable ?

Merci (en espérant avoir été clair ? )
Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:,
*George Abitbol* tapota sur f.c.o.l.configuration :

#!/bin/bash

for (( i=1 ; i <= $# ; i++ )) ;
do
eval echo $$i
toto=`eval echo $$i`


L'anti-slash est traité de manière spéciale quand il est à l'intérieur de
« backquotes » et qu'il est suivi des méta-caractères , ` et $.
Pour que l'anti-slash ne soit pas traité différemment des autres caractères,
il faut utiliser la substitution de commande $( ) :

toto=$(eval echo $$i)

echo $toto
done


--
Sébastien Monbrun aka TiChou

Avatar
Ronald
Le Thu, 14 Dec 2006 08:51:23 -0800, George Abitbol a écrit :


[snip]

bon, je vais surement passer pour un boulet, mais tant pis : mon
script, qui s'appelle blah, contient ça :
#!/bin/bash

for (( i=1 ; i <= $# ; i++ )) ;
do
eval echo $$i
toto=`eval echo $$i`
echo $toto
done



J'ai lu le fil, je ne sais pas si j'ai tout compris mais j'y vais de ma
petite proposition quand même.

#!/bin/sh
for i in $@ ;
do echo $i ;
toto=$$i ;
echo $toto ;
done

Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:,
*Ronald* tapota sur f.c.o.l.configuration :

#!/bin/sh
for i in $@ ;


Gare aux arguments contenant des séparateurs.

for i in "$@"

ou

IFS for i in $@

--
Sébastien Monbrun aka TiChou

Avatar
George Abitbol
Bonjour,


toto=`eval echo $$i`


L'anti-slash est traité de manière spéciale quand il est à l'int érieur de
« backquotes » et qu'il est suivi des méta-caractères , ` et $.
Pour que l'anti-slash ne soit pas traité différemment des autres cara ctères,
il faut utiliser la substitution de commande $( ) :

toto=$(eval echo $$i)


Merci beaucoup pour la reponse et pour l'explication.

--


Avatar
George Abitbol

J'ai lu le fil, je ne sais pas si j'ai tout compris mais j'y vais de ma
petite proposition quand même.

#!/bin/sh
for i in $@ ;


Un peu HS, le truc c'est que je veux pouvoir acceder à mes parametres
via leur indice dans le tebleau $@, d'où la boucle entre 1 et $#

do echo $i ;

toto=$$i ;


ca par contre c'est pas le comportement attendu, mon but etant de
passer la valeur de l'argument dans la variable toto. Dans une boucle
sur $@, ca serait tout simplement
toto=$i

echo $toto ;
done


Merci pour ta contribution.

--

1 2