Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Bash] Obtenir un random limité à n lettres

Avec n en argument d'exécution

    22 août 2019 à 11:47:41

    Bonjour,

    J'essaie de produire un script qui affiche un mot au hasard pris dans un fichier dico. Jusque là, c'est assez simple, il me suffit d'utiliser ceci :

    shuf -n 1 /usr/share/dict/words


    Seulement voilà, pour corser le défi, j'essaie de faire en sorte que ce random soit limité au nombre de lettres spécifié en argument d'exécution $1 : si ./monscript.sh a un argument 12, alors le script m'affiche un mot au hasard composé de 12 lettres.

    Or, là, je bute sur un obstacle, j'ai beau essayer de trifouiller avec grep, impossible de passer $1 comme valeur reconnaissable par celui-ci.

    À vot' bon cœur !

    • Partager sur Facebook
    • Partager sur Twitter
      22 août 2019 à 12:33:11

      Bonjour,

      Pourrais tu montrer ton script?

      Je pense avoir bien compris ce que tu souhaiterai faire: afficher un mot choisi au hasard dont le nombre de lettre peut-être défini.

      Mais je n'ai pas bien saisi où tu butes.

      Est-ce pour parser les arguments?

      Est-ce pour avoir uniquement une liste de mot de 12 caractères?

      De plus, quelles caractères contient le dictionnaire? l'alphabet? minuscule, majuscule? tiret «-»? éèàùâêû?

      • Partager sur Facebook
      • Partager sur Twitter
        22 août 2019 à 12:58:06

        Je bute sur le parsing de l'argument, je ne sais pas comment intégrer la valeur de $1 à grep (ou toute autre commande) de façon à faire comprendre au script que je veux un mot au hasard de n lettres.

        Voici mon code :

        #!/bin/bash
        
        motHasard=$( shuf -n 1 /usr/share/dict/words )
        motS1=$( grep (je bute ici) /usr/share/dict/words | shuf -n 1 )
        
        
        
        if [ -n $1 ]
        
        then 
        
        	echo $motS1
        
        else
        
        	echo $motHasard
        
        
        fi
        


        Il n'est pas impossible que j'ai fait une erreur grossière, je débute :)

        Quant au dictionnaire, c'est celui intégré à ubuntu, c'est une suite de mots en minuscule dont certains ont des apostrophes.

        -
        Edité par NCZ 22 août 2019 à 13:03:36

        • Partager sur Facebook
        • Partager sur Twitter
          22 août 2019 à 13:39:08

          Il faut définir un motif à chercher avec grep.

          Ici le motif va être une expression régulière étendue, donc ça donne quelques chose comme:

          #!/bin/bash
          if [ -n $1 ]; then # Tu peux aussi vérifier que $1 est bien un entier > 0
              grep -E "^[a-z']{$1}$" /usr/share/dict/words | shuf -n 1 
          else
              shuf -n 1 /usr/share/dict/words
          fi

          Attention, si grep ne retourne aucun mot, tu n'auras rien en sortie.

          ^:  début de ligne

          [a-z']: tous les caractères allant de a à z et apostrophe.

          {$1}: répétez $1nombre de fois

          $: fin de la ligne

          • Partager sur Facebook
          • Partager sur Twitter
            22 août 2019 à 15:06:02

            Merci, ta solution fonctionne si on entre effectivement un paramètre, mais si on n'entre rien, cela produit une erreur.

            grep: Contenu invalide de \{\}
            


            Ce que d'ailleurs je ne comprends pas puisque grep est censé être utilisé uniquement si on rentre un paramètre...

            • Partager sur Facebook
            • Partager sur Twitter
              22 août 2019 à 16:38:42

              grep -E "^[a-z']${1:+{$1}}$" /usr/share/dict/french

              si le premier paramètre du script existe, alors il est développé en lui ajoutant des accolades.

              après, il faut peut-être encore vérifier que le premier paramètre est un nombre...

              -
              Edité par dantonq 22 août 2019 à 16:40:18

              • Partager sur Facebook
              • Partager sur Twitter

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

                22 août 2019 à 17:01:08

                NicolasClz a écrit:

                Ce que d'ailleurs je ne comprends pas puisque grep est censé être utilisé uniquement si on rentre un paramètre...

                Non, c'est ma faute, j'ai pas fait attention à la condition et j'ai recopié bêtement. c'est:

                if [[ -n "$1" ]]; then

                ou

                if [ -n "$1" ]; then
                

                ou

                if [ "$1" ]; then

                Tu peux noter que la variable $1 est toujours entourée de guillemet, il faut toujours protéger ses variables avec des guillemets (justement pour éviter ce genre de problème lorsqu'elle sont vides ou n'existent pas). Les cas où on a besoin de ne pas protéger ses variables en Bash sont rares. Donc tant que tu ne sais pas pourquoi, t'embêtes pas et entourent les de guillemets tout le temps (c'est une bonne pratique) même lorsque ça ne te parait pas nécessaire.

                Si tu veux comprendre pourquoi if [ -n $1 ] est toujours vraie, tu peux utiliser la commande bash -x ton_script et tu verras comment bash interprète la condition selon si $1 est entouré de guillemets ou pas lorsque $1 n'existe pas.

                -
                Edité par KoaTao 22 août 2019 à 17:26:58

                • Partager sur Facebook
                • Partager sur Twitter
                  22 août 2019 à 17:12:52

                  Merci à vous deux ! Petit à petit, je progresse…
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [Bash] Obtenir un random limité à n lettres

                  × 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