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 :

Pendu en Bash Script


Sujet :

Linux

  1. #1
    Membre régulier Avatar de Othana
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 188
    Points : 86
    Points
    86
    Par défaut Pendu en Bash Script
    Voilà, j'ai pondu ça. Mais j'ai des bugs qui empêchent la bonne exécution.
    Pour tester, créez un fichier dictionnary.txt, contenant 5 mots séparés par des ";".
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    #!/bin/bash
     
    function Secret (){
    #rewrite the secretword's display during playing
      lesstmp=""
      msk="-"
      while [ $i -le {#2} ]
            do
    	  lettertest=$(cut -c$i $1)
              #to verify if there already is a known letter
              if [[ $lettertest = $msk && $2 != $i ]]
                then
                lesstmp=$($lesstmp + $msk)
    	    elif [ $lettertest != $msk ]
    	    then
    	    lesstmp=$($lesstmp + $lettertest)
    	    else
                lesstmp=$($lesstmp + $1)
              fi
              i=$(($i + 1))
            done
      $1=$lesstmp
    }
     
    function ChooseWord(){
    #here the program randomly get a word in a delimited file
      num=$((($RANDOM%4)+1))
      $1=$(cut -d';' -f$num $2)
    }
     
    function Core(){
    #this is the core of this wonderfull game of my own ;)
     
    life=10
    #number of chances
     
    nba=0
    #amount of attends
     
    lesssecret=""
    #the secret word which is displayed with known letters
     
    given=""
    #the list of given letters
     
    letter=""
    #the suggested letter
     
    secretword=""
    #this is the word you must find
     
    dictpath="./dictionnary.txt"
    #path to the words file
    ChooseWord $secretword, $dictpath
     
      while [[ $life > 0 || $lesssecret != $secretword ]]
       do
        clear
        if [ $life -gt 1 ]
          then
          lifeword="Lifes"
          else
          lifeword="Life"
        fi
        if [ $nba -gt 1 ]
          then
          attendword="Attends"
          else
          attendword="Attend"
        fi
        echo "####################################
    You have $life $lifeword	$attendword = $nba
     
         << $lesssecret >>
     
    Given letters : $given
    You can suggest a new letter : "
        echo "####################################"
        read $letter
        exist=1
        p=1
        until [ $p > {#secretword} ]
    	do
    	  if [ $letter = cut -c$p $secretword ]
    	    then
    	    Secret $letter, $p, $lesssecret, $secretword
    	    exist=0
    	    else
    	    pg=1
    	    until [ $pg > {#given} ]
    	      do
    	      if [ $letter = cut -c$gp $given ]
    		then
    		echo "Sorry, you already have enter this letter."
    		exist=0
    	      fi
    	      pg=$(($pg + 1))
    	      done
    	  fi
    	done
        if ! exist
          then
          echo "Sorry, but this letter is not in the secret word. You lose 1 life"
          nba=$(($nba + 1))
          life=$(($life - 1))
          given=$($given + $letter)
          sleep 5
        fi
       done
      if [ $lesssecret = $secretword ]
        then
        clear
        echo "CONGRATULATION !!! The word was > $secretword <"
        echo "You done it in $nba $attendword and you still have $life $lifeword."
        sleep 10
        else
        clear
        echo "Oooooh... No chance, you suddenly have troubles to swallow... G-gaaargl..."
        echo " A strong ageless voice from the sky say you that the word was > $secretword <"
        sleep 13
      fi
    }
     
    clear
    cat << display
    ################################
    # Welcome to this Hangman Game #
    ################################
     
    Would you start a new party (Y/N) ?
    display
    read ans
    for ans in y Y
      do
        Core
    cat << display
    ################################
    # Welcome to this Hangman Game #
    ################################
     
    Would you play again (Y/N) ?
    display
        read ans
      done
    exit
    Et oui, les textes et noms de variables sont en anglais
    Ah oui, ne proposez pas d'autres façons de l'écrire, il faut quand même que ça soit de moi Et puis j'aime bien ma structure en fonctions. Je m'amuse et je fais des essais.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 730
    Points : 31 053
    Points
    31 053
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mcferson Voir le message
    Voilà, j'ai pondu ça. Mais j'ai des bugs qui empêchent la bonne exécution.
    Pour tester, créez un fichier dictionnary.txt, contenant 5 mots séparés par des ";".
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    #!/bin/bash
     
    function Secret (){
    #rewrite the secretword's display during playing
    lesstmp=""
    while [ $i -le {#secretword} ]
    do
    if [ $2 != $i ]
    then
    $lesstmp=$($lesstmp+"-")
    else
    $lesstmp=$($lesstmp+$1)
    fi
    i=$(($i + 1))
    done
    $1=$lesstmp
    }
     
    function ChooseWord(){
    #here the program randomly get a word in a delimited file
    num=$( ($Random%4) + 1)
    $2=$(cut -d';' -f$num $1)
    }
     
    function Core(){
    #this is the core of this wonderfull game of my own ;)
     
    life=10
    #number of chances
     
    nba=0
    #amount of attends
     
    lesssecret=""
    #the secret word which is displayed with found letters
     
    given=""
    #the list of given letters
     
    letter=""
    #the suggested letter
     
    secretword=""
    #this is the word you must find
     
    ChooseWord ./dictionnary.txt $secretword
     
    while [[ $life > 0 || $lesssecret != $secretword ]]
    do
    clear
    if [ $life -gt 1 ]
    then
    lifeword="Lifes"
    else
    lifeword="Life"
    fi
    if [ $nba -gt 1 ]
    then
    attendword="Attends"
    else
    attendword="Attend"
    fi
    echo "######################################################
    You have $life $lifeword $attendword = $nba
     
    $lesssecret
     
    $given
    You can suggest a letter : $letter
    ######################################################
    "
    exist=1
    p=1
    until [ $p > {#secretword} ]
    do
    if [ $letter = cut -c$p $secretword ]
    then
    Secret $letter, $p, $lesssecret
    exist=0
    fi
    done
    if !exist
    then
    echo "Sorry, but this letter is not in the secret word. You lose 1 life"
    $nba=$(($nba + 1))
    $life=$(($life + 1))
    sleep 5
    fi
    done
    if [ $lesssecret = $secretword ]
    then
    clear
    echo "CONGRATULATION !!! The word was > $secretword <"
    echo "You done it in $nba $attendword and you still have $life $lifeword."
    else
    clear
    echo "Oooooh... No chance, you suddenly have troubles to swallow..."
    fi
    }
     
    clear
    cat << display
    ################################
    # Welcome to this Hangman Game #
    ################################
     
    Would you start a new party (Y/N) ?
    display
    read ans
    for ans in y Y
    do
    Core
    cat << display
    ################################
    # Welcome to this Hangman Game #
    ################################
     
    Would you play again (Y/N) ?
    display
    read ans
    done
    exit
    Et oui, les textes et noms de variables sont en anglais
    Ah oui, ne proposez pas d'autres façons de l'écrire, il faut quand même que ça soit de moi Et puis j'aime bien ma structure en fonctions. Je m'amuse et je fais des essais.
    J'ai pas testé, j'ai juste lu ton code mais voici ce que j'y ai relevé
    1) fais gaffe à tes fonctions car les variables ne sont pas locales. Exemple si t'as "i=5" dans ton code et que dans ta fonction tu écrits "i=12" ben en fin de fonction ton "i" vaudra 12. Et c'est pareil pour une variable dans une fonction X qui appelle une fonction Y.
    Pour rendre une variable locale, soit tu mets des parenthèses en début de code et en fin de code (juste après l'accolade ouvrante et avant l'accolade fermante donc), soit tu utilises le mot clef "local".

    2) on remplit une variable en écrivant "var=valeur" et non "$var=valeur"

    3) la syntaxe {#variable} sensée donner le nb de caractères de la variable ne fonctionne que si on met "$"

    4) la concaténation de texte dans une variable se fait simplement "var=texte1texte2" ou "var=${autre_variable}texte" et non "$var=texte1+texte2" (sauf si tu veux concaténer le caractère '+')

    5) le caractère ">" n'est pas reconnu par la commande "test" dans "until [ $p > machintruc ]"

    6) for ans in Y y ... read ans => là je ne pige absolument pas ce que t'as voulu faire. En fait si, je pige bien que t'as voulu faire une saisie style oui/non mais je ne pige pas la façon dont t'as écrit ça en shell...

    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
    while true
    do
        cat << _EOT_
    ################################
    # Welcome to this Hangman Game #
    ################################
     
    Would you play again (Y/N) ?
    _EOT_
     
        read rep
        rep=`echo $rep |tr '[:upper:]' '[:lower:]'`
        test $rep = "y" -o $rep = "n" && break
        echo "Bad rep - Try again"
    done
    Autre chose => apprends à indenter pour qu'on puisse mieux s'y retrouver dans tes structures...

  3. #3
    Membre régulier Avatar de Othana
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 188
    Points : 86
    Points
    86
    Par défaut
    édition du code. y a des changements. revoir le post de base.

    Le Y/N j'ai souhaité boucler dans un for. pour cela, je me suis dit : pour la réponse dans la liste y Y (pour considérer un y en min ou maj), puis sortir de cette boucle si nous n'étions pas dans la liste. Bon, déjà, je ne sors pas du tout...
    Je zieute tes corrections, mais j'ai pas tout compris, tu n'es pas clair sur les synthaxes et/ou pas assez complet. Genre, je veux concaténer DEUX variables contenant un texte...

    A suivre...

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 730
    Points : 31 053
    Points
    31 053
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mcferson Voir le message
    pour la réponse dans la liste y Y (pour considérer un y en min ou maj), puis sortir de cette boucle si nous n'étions pas dans la liste. Bon, déjà, je ne sors pas du tout...
    Principe de la boucle "for"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for var in elem1 elem2 elem3 ... elemX
    do
    ...
    done
    Le shell va instancier une boucle avec autant d'éléments que dans la liste "elem1 ..." et à chaque itération de ta boucle, ta variable "var" prendra la valeur du nième mot de ta liste (n étant le n° de tour en cours)
    Cours Shell Linux : http://linux.developpez.com/cours/

    Citation Envoyé par mcferson Voir le message
    ...tu n'es pas clair sur les synthaxes et/ou pas assez complet. Genre, je veux concaténer DEUX variables contenant un texte...
    Tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var1="Hello"
    var2="World"
    phrase="$var1$var2"     # => phrase=HelloWorld
    Maintenant si cela pose problème comme dans l'exemple suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prix=10
    phrase="mon vélo coute $prixF"      # La variable "prixF" n'existe pas
    Utiliser la syntaxe rigoureuse {}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prix=10
    phrase="mon vélo coute ${prix}F"  # Plus de problème

  5. #5
    Membre régulier Avatar de Othana
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 188
    Points : 86
    Points
    86
    Par défaut
    Je te remercie bien. J'ai effectivement mis la main sur ces erreurs, à la longue.
    Ceci est mon tout premier script bash complexe, après une 30aine d'heures d'aprentissage, seulement.
    J'y ai encore apporté des modifs, mais pour l'heure, tout cela n'a plus d'importance. Je me suis fait jeter de la boite qui devait m'embaucher, sous le faux prétexte que ce code ne marchait pas, alors qu'ils ont pris une personne qui n'avait jamais programmé, qui ne comprennait rien en anglais...

Discussions similaires

  1. bash script error
    Par yli_ren dans le forum Linux
    Réponses: 2
    Dernier message: 10/09/2007, 14h53
  2. utilisation des bash script
    Par yli_ren dans le forum Administration système
    Réponses: 5
    Dernier message: 08/09/2007, 23h07
  3. [Bash script] comment matcher avec un regexp
    Par beloc dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 24/08/2007, 13h33
  4. comment exécuter un bash script à l'intérieur de ma classe java?
    Par moradbe dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 04/03/2007, 04h37
  5. Probleme avec mon bash script
    Par spynux dans le forum Linux
    Réponses: 1
    Dernier message: 30/03/2006, 09h21

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