#1 Le 01/01/2014, à 20:07
- patricel2006
afficher un paramètre sur deux dans une boucle for
Bonjour,
Voici le script que je voudrais faire tourner :
#! /bin/bash
for param in "$@" ; do
echo "$param"
shift 2
done
Le problème est que rédigé ainsi, le script ne prend pas en compte la commande "shift 2" et affiche tous les paramètres.
Ma question est donc de savoir comment faire en sorte que la commande shift 2 soit prise en compte dans la boucle for et permette ainsi d'afficher un
paramètre sur deux.
Merci d'avance pour vos réponses.
Hors ligne
#2 Le 01/01/2014, à 20:53
- pingouinux
Re : afficher un paramètre sur deux dans une boucle for
Bonjour,
while [ "$1" ]; do
echo "$1"
shift; shift
done
Hors ligne
#3 Le 01/01/2014, à 21:17
- Watael
Re : afficher un paramètre sur deux dans une boucle for
salut,
#!/bin/bash
for i do ((n++%2)) && echo "$i"; done
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 02/01/2014, à 16:40
- patricel2006
Re : afficher un paramètre sur deux dans une boucle for
Bonjour,
Merci à tous les deux pour vos réponses rapides et pertinentes.
Concernant la première réponse ( Pingouinux ), effectivement le script tourne avec une boucle while
et pas avec une boucle for, sans que je sache vraiment dire pourquoi...
Dans la deuxième, j'ai un peu plus de mal à interpréter la double paranthèse "((n++%2))" : le n++sert normalement à incré
menter de 1 ce "n" qui serait le numéro du paramètre, et le % jouerait le role du shift ? Je ne l'ai pas encore testé...mais ça ne saurait tarder.
A +
Hors ligne
#5 Le 02/01/2014, à 18:29
- pingouinux
Re : afficher un paramètre sur deux dans une boucle for
Avec la boucle for, les paramètres sont lus au début, et le shift est sans effet.
Dans la commande de Watael #3
((n++%2))
On prend le reste de la division de n par 2, puis n est incrémenté de 1. n valant 0 la première fois, on imprime un paramètre sur deux en commençant par le deuxième.
Pour commencer par le premier
((++n%2))
On incrémente alors n avant de calculer le reste de la division par 2.
Hors ligne
#6 Le 03/01/2014, à 00:04
- patricel2006
Re : afficher un paramètre sur deux dans une boucle for
Bonsoir,
Ok, le script de Watael tourne comme une horloge...Cependant, il y a plusieurs choses que je ne pige pas :
1. Pourquoi faut-il incrémenter dans la double parenthèse alors que nous sommes dans une boucle for qui est déjà censée le faire ?
2. Que vient faire le modulo 2 ? Pour tous les nombres pairs (0, 2, 4...)le reste sera 0 et 1 pour tous les impairs ! On obtient donc un modulo 2 = 0 puis 1, puis 0, puis 1 etc...
3. Comment le "n" est-il interprété directement comme étant le numéro de paramètre? Pourrait-on le remplacer par $i?
Hors ligne
#7 Le 03/01/2014, à 05:17
- Postmortem
Re : afficher un paramètre sur deux dans une boucle for
Salut,
Bonsoir,
Ok, le script de Watael tourne comme une horloge...Cependant, il y a plusieurs choses que je ne pige pas :
1. Pourquoi faut-il incrémenter dans la double parenthèse alors que nous sommes dans une boucle for qui est déjà censée le faire ?
Le for n'incrémente rien ici, il ne fait qu'attribuer à la variable les paramètres un par un.
2. Que vient faire le modulo 2 ? Pour tous les nombres pairs (0, 2, 4...)le reste sera 0 et 1 pour tous les impairs ! On obtient donc un modulo 2 = 0 puis 1, puis 0, puis 1 etc...
Les double parenthèse servent pour les expressions arithmétiques. Si la valeur de l'expression est différente de 0, alors l'expression est vrai. Si la valeur est de 0, l'expression est fausse.
Ainsi, dans ((n++%2)) && echo "$i", le echo "$i" n'est exécuté qu'un coup sur 2.
3. Comment le "n" est-il interprété directement comme étant le numéro de paramètre? Pourrait-on le remplacer par $i?
n n'est pas initialisé au départ et quand une variable n'est pas initialisée dans une expression arithmétique, elle prend la valeur 0.
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#8 Le 05/01/2014, à 19:24
- patricel2006
Re : afficher un paramètre sur deux dans une boucle for
Bonsoir à tous,
Merci à Postmortem (Quel nom!) pour sa réponse détaillée et matinale !
Je comprends un peu mieux grâce à lui. En gros l'utilisation de cette expression arithmétique est un moyen d'avoir une expression VRAIE (si expression != 0) une fois sur deux, donc d'exécuter la commande sur réussite "&&" une fois sur deux également ce qui était le but recherché.
Hors ligne