IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Fonction until en bourne shell


Sujet :

Linux

  1. #1
    Membre chevronné Avatar de alexp
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    459
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 459
    Par défaut Fonction until en bourne shell
    J'ai un peu avancé dans ma decouverte du bourne shell et j'ai realisé un exercice consistant à tester la parité d'un nombre et selon la reponse doit effectuer un certain nombre d'operation. (à noter que pour la valeur rentré à la commande ce n'est as fini, pour le moment je souhaite resoudre le problème de la valeur rentré à la demande)
    voici le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    #!/bin/bash
    if [ $# -eq 0 ]
    then echo -n Fournissez moi un nombre s\'il vous plaît:; read ca; 
    until test [ $ca -ne 1 ]
    do
    echo -n $ca;
    case $ca in
    *1|*3|*5|*7|*9) echo le nombre $ca est impair; ca=`expr \( $ca \* 3 \) + 1`; echo $ca;;
    *0|*2|*4|*6|*8) echo le nombre $ca est pair; ca=`expr \( $ca / 2 \)`; echo j\'obtiens $ca;;
    esac;
    done
    if test $ca -eq 1 
    then break
    fi
    echo je suis parvenu à 1;
    else 
     if [ $1 -ne 1 ]
    then
    case $1 in
    *1|*3|*5|*7|*9) echo le nombre $1 est impair; ca=`expr \( $1 \* 3 \) + 1`; echo $ca;;
    *0|*2|*4|*6|*8) echo le nombre $1 est pair; ca=`expr \( $1 / 2 \)`; echo j\'obtiens $ca;;
    esac
    else
    echo je suis parvenu à 1
    fi
    fi

    le problème que je rencontre, c'est avec la boucle until, elle doit s'arreter lorsque le nombre atteint la valeur 1,mais là elle ne s'arrete jamais(sauf en tapant control c), et j'ai un message qui apparait me disant que j'ai trop d'argument sur la ligne until. Je presume que ce sont les crochets qu'il faut enlever, mais si je les enlève, les valeurs intermediaire ne s'affiche plus.
    Donc si quelqu'un connait la reponse, je le remercie d'avance de m'aider

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    until test [ $ca -ne 1 ]
    do
    echo -n $ca;
    case $ca in
    *1|*3|*5|*7|*9) echo le nombre $ca est impair; ca=`expr \( $ca \* 3 \) + 1`; echo $ca;;
    *0|*2|*4|*6|*8) echo le nombre $ca est pair; ca=`expr \( $ca / 2 \)`; echo j\'obtiens $ca;;
    esac;
    done
    Tu dois boucler jusqu'à ce que la valeur de $ca soit égale à 1.
    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    until test [ $ca -eq 1 ]
    et pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    until test [ $ca -ne 1 ]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 30
    Par défaut
    Que veux-tu faire exactement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    until test [ $ca -ne 1 ]
    Effectivement, "test" et [] font double emploi, le script tourne mais avec des erreurs : "test: too many arguments".
    Dans les conditions d'écriture de ton script de départ n'était-ce pas "while" plutot que "until" qu'il aurait fallu utiliser ?
    Oui, comme le dit Mygale1978 le code : est nettement préférable pour etre sur que le programme s'arrete toujours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/bin/bash
    read ca
      until [ $ca -le 1 ]
        do
        case $ca in
          *1|*3|*5|*7|*9) echo le nombre $ca est impair
          ca=`expr \( $ca \* 3 \) + 1`
          echo $ca;;
          *0|*2|*4|*6|*8) echo le nombre $ca est pair
          ca=`expr \( $ca / 2 \)`
        echo "j'obtiens" $ca;;
        esac;
      done
     
    knoppix@0[tmp]$ alex
    5
    le nombre 5 est impair
    16
    le nombre 16 est pair
    j'obtiens 8
    le nombre 8 est pair
    j'obtiens 4
    le nombre 4 est pair
    j'obtiens 2
    le nombre 2 est pair
    j'obtiens 1
    knoppix@0[tmp]$
    Si cela peut t'aider, il y a avantage à faire des petits scripts que l'on teste isolément et a bien indenter son code. Quand ils marchent on les insère dans le script final et ainsi de suite jusqu'à obtention du résultat attendu.
    Bonne étude du shell.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 106
    Par défaut
    Mes remarques.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    #!/bin/bash
    if [ $# -eq 0 ]
    then echo -n Fournissez moi un nombre s\'il vous plaît:; read ca;
    Il manque un FI ici !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    until test [ $ca -ne 1 ]
    En effet c un while au lieu de until
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    do
    echo -n $ca;
    case $ca in
    *1|*3|*5|*7|*9) echo le nombre $ca est impair; ca=`expr \( $ca \* 3 \) + 1`; echo $ca;;
    *0|*2|*4|*6|*8) echo le nombre $ca est pair; ca=`expr \( $ca / 2 \)`; echo j\'obtiens $ca;;
    esac;
    done
    if test $ca -eq 1 
    then break
    fi
    Ici "echo je suis parvenu à 1;" s executera qlq soiit le résultat du test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    echo je suis parvenu à 1;
    else 
     if [ $1 -ne 1 ]
    then
    case $1 in
    *1|*3|*5|*7|*9) echo le nombre $1 est impair; ca=`expr \( $1 \* 3 \) + 1`; echo $ca;;
    *0|*2|*4|*6|*8) echo le nombre $1 est pair; ca=`expr \( $1 / 2 \)`; echo j\'obtiens $ca;;
    esac
    else
    echo je suis parvenu à 1
    fi
    fi

  5. #5
    Membre chevronné Avatar de alexp
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    459
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 459
    Par défaut
    rebonjour tout le monde. Voila j'ai terminé le script et il fonctionne comme demandé. Je vous mets le detaille ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/bin/bash
    if [ $# -eq 0 ]
    then echo -n Fournissez moi un nombre s\'il vous plaît:; read ca; 
    until [ $ca -eq 1 ]
    do
    case $ca in
    *1|*3|*5|*7|*9) echo -n $ca est impair,; ca=`expr \( $ca \* 3 \) + 1`; echo j\'obtiens donc $ca ;;
    *0|*2|*4|*6|*8) echo -n $ca est pair,; ca=`expr \( $ca / 2 \)`; echo j\'obtiens donc $ca ;;
    esac;
    done
    echo je suis parvenu à 1;
    else 
     if [ $1 -ne 1 ]
    then
    ca=$1
    until [ $ca -eq 1 ]
    do
    case $ca in
    *1|*3|*5|*7|*9) echo -n $ca est impair,; ca=`expr \( $ca \* 3 \) + 1`; echo j\'obtiens donc $ca;;
    *0|*2|*4|*6|*8) echo -n $ca est pair,; ca=`expr \( $ca / 2 \)`; echo j\'obtiens donc $ca;;
    esac
    done
    echo je suis parvenu à 1
    else
    echo je suis parvenu à 1
    fi
    fi
    Merci Peter, Mygale1978, insupien pour votre aide et vos conseils.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. bourne shell init de tableau
    Par pcouas dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 08/09/2011, 22h00
  2. bourne shell ajout d'argument depuis le shell à ceux reçus en entrée
    Par pcouas dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 07/09/2011, 08h08
  3. Réponses: 3
    Dernier message: 19/11/2009, 18h01
  4. tester l'existence d'une variable en bourne SHELL
    Par nicolas.pailheret dans le forum Linux
    Réponses: 1
    Dernier message: 14/04/2009, 17h28
  5. Code en bourne shell du jeu Le "PENDU"
    Par piment dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 20/07/2007, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo