Partage
  • Partager sur Facebook
  • Partager sur Twitter

Script bash - demande de prompt avec temps imparti

    25 juin 2021 à 11:02:18

    Hello à tous,

    Je réalise une sorte de jeu dans lequel un script pose une série de questions et d'énigmes auxquelles répondre.

    Idéalement, je souhaite que l'utilisateur ait un nombre illimité de tentatives, mais un maximum de 300 secondes pour donner la bonne réponse, sans quoi ça passe à la suite.

    Le read -t 300 ne me convient pas, car le compteur se reset à chaque tentative de l'utilisateur.

    J'ai essayé de manipuler la variable SECONDS, mais la condition if $SECONDS > 300 ne se vérifie pas si l'utilisateur ne réalise pas une tentative.

    Je me suis dit que je pouvais avoir un script main qui appellerait différents scripts contenant chacun une énigme avec la commande timeout, mais ça ne fonctionne pas :
    Le script est appelé correctement, il fait sa demande de prompt de la bonne réponse -> mais quelque soit la réponse donnée, le script "freeze" et impossible de faire quoi que ce soit jusqu'à la fin du timeout (cf capture)

    fichier main.test :

    #!/bin/bash
    
    timeout 30 /home/toto/jeu_XYZ/epreuve1

    fichier epreuve1 :

    ganswer="/backup/startup/bootloader"
    
    while [ "$tanswer" != "$ganswer" ]; do
            read -p "Emplacement du chargeur d'amorcage: " tanswer
    done

    Sachant que le fichier epreuve1 fonctionne indépendamment de main.test

    Bon du coup je ne sais pas quoi faire, mis à part éventuellement me résigner à laisser une tentative maximum pour l'utilisateur. J'ai regardé sur internet les scripts de 50 lignes sans pour autant arriver à les faire fonctionner.

    En espérant que quelqu'un ait une idée :)

    -
    Edité par Hibiscae 25 juin 2021 à 11:05:23

    • Partager sur Facebook
    • Partager sur Twitter
      25 juin 2021 à 13:29:47

      salut,

      quelque chose comme ça ?

      #!/bin/bash
      
      mapfile -t questionnaire < /chemin/questions
      mapfile -t solutions < /chemin/solutions
      
      for item in "${!questionnaire[@]}"
      do
         SECONDS=0
         delai=300
         until test "$reponse" = "${solutions[item]}"
         do
            read -t $delai -p "${questionnaire[item]} : " reponse
            (( delai-=SECONDS, delai > 0 )) || { echo "erreur: ..." >&2; break;}
            #...comptePoints...
         done
      done

      -
      Edité par dantonq 26 juin 2021 à 15:10:48

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        28 juin 2021 à 9:04:50

        Yes ! En bricolant je suis arrivé Vendredi à l'idée à laquelle j'aurai du penser depuis le début en mettant un read -p avec une variable

        J'étais en déplacement j'ai pas pu répondre sorry

        #!/bin/bash
        
        ganswer="reponse"
        
        (( "timer = 20" ))
        
        while [ "$timer" != 0 ]; do
                SECONDS=0
                read -r -t "$timer" -p "Question: " tanswer
                (( "timer = timer - $SECONDS" ))
                if [ "$tanswer" != "$ganswer" ]; then
                        echo "Faux, temps restant: $timer"
                fi
                if [ "$tanswer" == "$ganswer" ]; then
                        echo "bravo"
                        (( "timer = 0" ))
                fi
        done
        echo "programme ok"

        Ton programme est fait différemment ceci dit, tu pourrais m'expliquer le contenu de cette ligne ?

        (( delai-=SECONDS, delai > 0 )) || { echo "erreur: ..." >&2; break;}

        Merci beaucoup :)

        -
        Edité par Hibiscae 28 juin 2021 à 9:07:25

        • Partager sur Facebook
        • Partager sur Twitter
          28 juin 2021 à 9:27:57

          l'évaluation arithmétique a une double fonction :

          - assigner la valeur de delai - SECONDS à delai

          - vérifier que delai est strictement supérieur à 0

          si les vérifications échouent (réponse fausse (condition de la boucle while) et temps écoulé) un message d'erreur est affiché sur la sortie d'erreur et on sort de la boucle while.

          dans ton script,

          es guillemets sont inutiles dans les évaluations arithmétiques.

          la première assignation arithmétique est d'ailleurs inutile : timer=20 fonctionne aussi bien
          en bash, on peut attribuer le type numérique à cette variable : declare -i timer=20

          != est un opérateur lexical, il vaut mieux utiliser -ne, -gt... cf. help test

          == ne devrait n'être utilisé que là où il a du sens  : entre crochets doubles.

          ensuite

          if test "$v" != "$w" # faux
          then
             : ...
          else # vrai, donc 
             : ...
          fi

          -
          Edité par dantonq 28 juin 2021 à 9:28:32

          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

            28 juin 2021 à 13:17:27

            Oke ça marche, j'adapterai en fonction, merci beaucoup pour tes explications :)



            -
            Edité par Hibiscae 28 juin 2021 à 13:18:30

            • Partager sur Facebook
            • Partager sur Twitter

            Script bash - demande de prompt avec temps imparti

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown