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 12/10/2010, à 09:50

cracolinux

[✔] Utilisation des parametres de position dans une boucle

smile
Bonjour, et merci d'avance à ceux qui prendront le temps de m'aider !

Voici le cas :

mot="toto tata titi"
set $mot
set "$@"

→donc $1="toto  $2="tata  et  $3="titi"

Maintenant voilà :


for ((i=1; i<=$#; i++)); do echo "$$i"; done

me donne:

1991i
1991i
1991i

et

for ((i=1; i<=$#; i++)); do echo "$"$i""; done

me donne:

$1
$2
$3


j'ai essayé différentes syntaxes (parfois même au hasard...) sans trouver comment obtenir la valeur de mes paramètres de position, c'est à dire toto tata et titi

Je suis coincé et je n'ai pas trouvé de sujets correspondants. neutral

....à vot' bon coeur m'sieus dames

Dernière modification par cracolinux (Le 01/10/2014, à 07:32)


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

#2 Le 12/10/2010, à 09:58

credenhill

Re : [✔] Utilisation des parametres de position dans une boucle

hello

for ((i=1; i<=$#; i++)); do echo "${!i}; done

Hors ligne

#3 Le 12/10/2010, à 10:19

cracolinux

Re : [✔] Utilisation des parametres de position dans une boucle

Whah!! quelle rapidité!
Merci beaucoup credenhill!

Ça fonctionne impeccablement!
Me reste plus qu'a ajouter ce ! dans mon carnet et allez chercher des infos dessus!
Quel plaisir d'apprendre de nouvelles choses et d'explorer le bash scripting, c'est super puissant!

Z'avez vu ? j'utilise déjà beaucoup ce ! dans mes phrases : c'est parce que ça me rend enthousiaste ce forum !

wink  merci encore


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

#4 Le 12/10/2010, à 11:51

ehmicky

Re : [✔] Utilisation des parametres de position dans une boucle

cracolinux a écrit :
mot="toto tata titi"
set $mot
set "$@"

Par ailleurs, le set "$@" ne fait rien ici (si ce n'est dire : "Tous les arguments positionnels deviennent tous les arguments positionnels"). Et set -- $mot te permettrait d'éviter des problèmes si le contenu de mot commence par un tiret.
Enfin, je le dis au cas où même si je pense que tu sais, mais tu peux faire directement un :

mot="toto tata titi"
for i in $mot ; do
echo "$i"
done

Dernière modification par ehmicky (Le 12/10/2010, à 11:54)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#5 Le 12/10/2010, à 12:53

Totor

Re : [✔] Utilisation des parametres de position dans une boucle

ehmicky a écrit :
mot="toto tata titi"
for i in $mot ; do
echo "$i"
done

Ce n'est pas une bonne habitude à prendre car cette solution implique que tous les éléments soient des éléments simples (sans blanc).
si l'on veut éviter de passer par les paramètres de position, il est préférable d'utiliser un tableau :

mot=( toto titi tata "mot composé" )
for i in "${mot[@]}"
do
echo "$i"
done

sinon, si il s'agit de parcourir les paramètres de position, la forme la plus simple est :

for i
do
echo "$i"
done

qui est un équivalent à for i in "$@"...


-- Lucid Lynx --

Hors ligne

#6 Le 29/02/2012, à 22:11

cracolinux

Re : [✔] Utilisation des parametres de position dans une boucle

salut

je suis toujours dans le jus les gars !! lol

J'ai une fonction que j'appele demande

function demande
{
numlastarg=$#
declare ${!numlastarg}    

for a in $(seq 1 $(( $# - 1 ))) 
do
echo ""$a" -- "${!a}""
done
echo
read -p " : " num

${!numlastarg}=$(echo ${!num})

}

demande toto tatu titi jacky result

echo "$result"

je voudrais que la fonction remplisse la variable result (dernier parametre) avec le parametre choisi.
Vous voyez ?

Le but est de construire des menus de choix numéroté pour script console

Dernière modification par cracolinux (Le 29/02/2012, à 22:13)


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

#7 Le 01/03/2012, à 07:39

pingouinux

Re : [✔] Utilisation des parametres de position dans une boucle

Bonjour,
Pour faire tourner ce script :

  • Supprimer cette ligne

    declare ${!numlastarg}
  • Ajouter eval

    eval ${!numlastarg}=$(echo ${!num})

Autre façon de faire :

result=$(zenity --list --radiolist --column="" --column=Choix FALSE toto FALSE tatu FALSE titi FALSE jacky)
echo "$result"

Dernière modification par pingouinux (Le 01/03/2012, à 09:12)

Hors ligne

#8 Le 01/03/2012, à 09:34

Postmortem

Re : [✔] Utilisation des parametres de position dans une boucle

Salut,
Tu peux aussi utiliser select pour faire des choix :

select a in toto tatu titi jacky
do
echo "$a"
done

Pour ta fonction demande, cela donnerait quelque chose comme ça :

function demande
{
   numlastarg=$#

   select a in "${@:1:$#-1}"
   do
      eval ${@: -1}='$a'
      if [[ -n "$a" ]]
      then
         break
      else
         REPLY=
      fi
   done
}

demande toto tatu titi jacky result

echo "$result"

Le break permet de sortir de la boucle.
REPLY= permet de re-afficher les choix en cas de mauvaise réponse.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#9 Le 01/03/2012, à 10:47

cracolinux

Re : [✔] Utilisation des parametres de position dans une boucle

Merci les gens !

Un copain m'a aussi proposé d'utiliser eval que je ne connaissais pas, c'est puissant ça! ... voir plus loin, eval peut être pratique, mais il faut faire attention ... toxicité ...

Je connaissais pas select (décidément, je connais pas grand chose!), ça à l'air d’être exactement fait pour des menus.
Par contre ça permet pas de choisir vraiment la gueule de son menu...mais bon ça me dérange pas ça.

Super !
(je repasse en résolu 100%)  tongue

Dernière modification par cracolinux (Le 02/03/2012, à 15:23)


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

#10 Le 01/03/2012, à 13:34

Watael

Re : [✔] Utilisation des parametres de position dans une boucle

non, eval c'est toxique.
Dans le cas présent, utilisez declare.

edit: sauf que declare dans une fonction rend la variable locale, jusqu'à bash 4.2 qui, lui, propose une option -g pour declare afin de "globaliser" une déclaration.

Dernière modification par Watael (Le 01/03/2012, à 13:47)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 01/03/2012, à 14:30

cracolinux

Re : [✔] Utilisation des parametres de position dans une boucle

Alors, une solution sans utiliser eval il me faudrait.
Mais trop difficile pour moi ce problème est.

neutral

Edit : declare ? comment ça, je pensais que c'était juste pour declarer des variables, tableau etc...

Dernière modification par cracolinux (Le 01/03/2012, à 14:46)


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

#12 Le 01/03/2012, à 14:34

Postmortem

Re : [✔] Utilisation des parametres de position dans une boucle

Watael a écrit :

non, eval c'est toxique.
Dans le cas présent, utilisez declare.

edit: sauf que declare dans une fonction rend la variable locale, jusqu'à bash 4.2 qui, lui, propose une option -g pour declare afin de "globaliser" une déclaration.

Pourquoi c'est toxique d'utiliser eval ?
Il y a des cas où il faut l'utiliser et d'autres non ?


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#13 Le 01/03/2012, à 19:22

Watael

Re : [✔] Utilisation des parametres de position dans une boucle

je vous le traduis comme je m'en souviens (et je ne le remet plus en question, maintenant) :
«si `eval' est la solution, alors le problème a été mal posé»

c'est toxique par rapport à "c'est puissant ça!"

il vaut mieux ne pas le recommander comme la panacée, plutôt que d'induire une éventuelle faille dans un script.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 02/03/2012, à 13:44

Levi59

Re : [✔] Utilisation des parametres de position dans une boucle

c'est toxique parce que ça te transforme tout et n'importe quoi en tout et n'importe quoi.
ex
tu récupères du texte dans un fichier et tu créés des variables à partir de ça :
eval $var1$var2=$var3$var4

Imagine que par malheur, malveillance ou bêtise, $var1 contienne "rm " et $var2 " -f / " et bien eval va traduire en rm -f / ="valeur" et lancer le rm -f sur / et ="valeur".

akira@virtualcrunchbang:~/tmp$ >1 >2 >3 >4 >5
akira@virtualcrunchbang:~/tmp$ ls
1  2  3  4  5
akira@virtualcrunchbang:~/tmp$ a='rm '
akira@virtualcrunchbang:~/tmp$ b='/home/akira/tmp/* '
akira@virtualcrunchbang:~/tmp$ declare -a $a$b="valeur"
bash: declare: « /home/akira/tmp/1 » : identifiant non valable
bash: declare: « /home/akira/tmp/2 » : identifiant non valable
bash: declare: « /home/akira/tmp/3 » : identifiant non valable
bash: declare: « /home/akira/tmp/4 » : identifiant non valable
bash: declare: « /home/akira/tmp/5 » : identifiant non valable
bash: declare: « =valeur » : identifiant non valable
akira@virtualcrunchbang:~/tmp$ ls
1  2  3  4  5
akira@virtualcrunchbang:~/tmp$ eval $a$b="valeur"
rm: impossible de supprimer « =valeur »: Aucun fichier ou dossier de ce type
akira@virtualcrunchbang:~/tmp$ ls
akira@virtualcrunchbang:~/tmp$ 

eval va considérer que tu veux formater ton PC... Pas géniale comme idée...
declare par contre va juste planter (bon j'ai pas vraiment cherché à savoir si il existait un exemple plus propre mais je tiens à ma VM ^^

Dernière modification par Levi59 (Le 02/03/2012, à 13:46)

Hors ligne

#15 Le 02/03/2012, à 13:56

cracolinux

Re : [✔] Utilisation des parametres de position dans une boucle

Merci ! c'est un exemple clair qui me fait bien comprendre le coté toxique
bon, je vais faire quelques petites modifications... big_smile

Dernière modification par cracolinux (Le 02/03/2012, à 13:56)


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

#16 Le 02/03/2012, à 14:15

Postmortem

Re : [✔] Utilisation des parametres de position dans une boucle

Salut,
Merci pour l'exemple Levi59.
Mais eval est pratique dans certains cas... Enfin, dans certains scripts, je n'ai pas trouvé comment faire sans, en particulier sur des serveurs au taf où on doit faire nos scripts en ksh (ksh88 donc sans tableaux indéxés par des chaînes de caractères). Mais dans ces cas, le contenu des variables est "maitrisé".
Après, une autre approche me permettrait peut-être de faire sans eval. Faudrait que je m'y repenche.
Quoiqu'il en soit, je note le coté toxique d'eval !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne