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

patricel2006 a écrit :

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.

patricel2006 a écrit :

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.

patricel2006 a écrit :

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