[script sh] boucle for

pom -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour, savez-vous comment faire une boucle "pour" en script sh ?

j'aimerais faire : "pour i = 20 à 10 par pas de -2". Merci.
Configuration: Suse Pro 9.3

5 réponses

  1. jisisv Messages postés 3678 Statut Modérateur 936
     
    Je ne sais pas si l'utilitaire seq est livré sous Suse, mais sous mon Etch
    johan@johan:~$ for x in $(seq  1 10); do echo -n "$x "; done ; echo
    1 2 3 4 5 6 7 8 9 10
    johan@johan:~$ for x in $(seq  -w 1 10); do echo -n "$x "; done ; echo
    01 02 03 04 05 06 07 08 09 10
    johan@johan:~$ for x in $(seq  -w 1 3 15); do echo -n "$x "; done ; echo
    01 04 07 10 13
    johan@johan:~$ dpkg -S $(which seq)
    coreutils: /usr/bin/seq
    


    man seq , donc
    Johan
    12
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      seq je ne savais pas. Merci.

      lami20j
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Salut,

      Itou, merci ;-))
      0
    3. pom
       
      OK, merci ! elle est trop bien cette commande seq !!
      0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Résumé de la solution en ligne de commandes :

    for x in $(seq 20 -2 10); do echo $x; done


    Dans un script shell :

    #!/bin/sh    
    
    for x in $(seq 20 -2 10)    
    do    
      echo $x    
    done    
    


    Note : on peut aussi utiliser l'opérateur backquote au lieu de $(...).

    Bonne continuation
    4
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Une petite recherche google donne :
    http://www.bsdbooks.net/shells/scripting/fr/loops1.html

    Un autre exemple disponible ici
    https://www.tuteurs.ens.fr/unix/shell/boucle.html
    #!/bin/sh
    # Fichier "liste"
    
    for element in *
       do echo "$element"
    done

    Bonne chance
    1
  4. pom
     
    Bonjour, merci pour vos réponses. J'ai écrit hier une solution mais je ne comprends pas bien mon résultat obtenu. Voici mon code :

    #!/bin/sh
    
    var=20
    while [ var > 10 ]
    do
      echo "var = $var"
      var=`expr $var - 2`
    done
    


    et voici ma sortie :

    var = 20
    var = 18
    var = 16
    var = 14
    var = 12
    var = 10
    var = 8
    var = 6
    var = 4
    var = 2
    var = 0
    var = -2
    var = -4
    var = -6
    var = -8
    var = -10
    var = -12
    var = -14
    var = -16
    var = -18
    var = -20
    var = -22
    


    et ainsi de suite...
    Pourquoi le calcul ne s'arrête pas lorsque var<=10 ?
    Et comment faire pour écrire "tant que var est supérieur ou égal à 10" ? J'ai essayé la formule " >= " (cf www.shellunix.com) mais ça n'a pas l'air de bien marcher...
    Merci encore.
    1
    1. jisisv Messages postés 3678 Statut Modérateur 936
       
      Essaye plutôt ceci:
      johan@johan:~$ var=25 ;while [ $var -gt 10 ]; do   echo "var = $var";   var=`expr $var - 2`; done
      var = 25
      var = 23
      var = 21
      var = 19
      var = 17
      var = 15
      var = 13
      var = 11

      C'est l'opérateur -gt qu'il faut utiliser.
      Ne pas oublier le $ devant le nom de la variable (hors assignation)
      extrait de man [
      INTEGER1 -eq INTEGER2
      INTEGER1 is equal to INTEGER2

      INTEGER1 -ge INTEGER2
      INTEGER1 is greater than or equal to INTEGER2

      Johan
      0
      1. pom > jisisv Messages postés 3678 Statut Modérateur
         
        OK, effectivement, le code suivante marche correctement

        #!/bin/sh
        
        var=20
        while [ $var -ge 10 ]
        do
          echo "var = $var"
          var=`expr $var - 2`
        done
        


        Merci
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut;
    #!/bin/bash
    
    i=20
    until [ ! "$i" -ge "10" ]
    do
    echo $i
    sleep 1
    i=$(expr $i - 2)
    done
    ;-))
    0