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.
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.
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.
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.
× 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.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique