#1 Le 12/10/2010, à 10:50
- cracolinux
[✔] Utilisation des parametres de position dans une boucle
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.
....à vot' bon coeur m'sieus dames
Dernière modification par cracolinux (Le 01/10/2014, à 08:32)
#2 Le 12/10/2010, à 10: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, à 11: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 !
merci encore
#4 Le 12/10/2010, à 12:51
- ehmicky
Re : [✔] Utilisation des parametres de position dans une boucle
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, à 12: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, à 13:53
- Totor
Re : [✔] Utilisation des parametres de position dans une boucle
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, à 23:11
- cracolinux
Re : [✔] Utilisation des parametres de position dans une boucle
salut
je suis toujours dans le jus les gars !!
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, à 23:13)
#7 Le 01/03/2012, à 08: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, à 10:12)
Hors ligne
#8 Le 01/03/2012, à 10: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, à 11: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%)
Dernière modification par cracolinux (Le 02/03/2012, à 16:23)
#10 Le 01/03/2012, à 14: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, à 14:47)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 01/03/2012, à 15: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.
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, à 15:46)
#12 Le 01/03/2012, à 15:34
- Postmortem
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.
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, à 20: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, à 14: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, à 14:46)
Hors ligne
#15 Le 02/03/2012, à 14: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...
Dernière modification par cracolinux (Le 02/03/2012, à 14:56)
#16 Le 02/03/2012, à 15: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