Meilleur moyen de générer une chaîne aléatoire en suivant un modèle spécifique dans Bash

Je veux générer beaucoup de six chaînes de caractères en suivant ce modèle:

[consonne] [voyelle] [consonne] [consonne] [voyelle] [consonne]

par exemple

haplop
github
Qursog

J’ai examiné différentes manières de faire cela, mais rien de ce que j’ai fait jusqu’à présent n’est élégant. Mes pensées tournaient principalement autour de la génération d’un personnage à la fois mais même dans ce cas, mes idées n’étaient pas vraiment bonnes à cause de mon manque de connaissance de script bash et de commandes obscures de Linux.

Idéalement, je recherche une commande Linux qui génère de manière aléatoire une chaîne mais me permet de spécifier le modèle ci-dessus (s’il en existe un). Sinon, si vous connaissez un moyen simple de le faire en bash, ce serait également génial.

Merci d’avance

Edit: BTW, je vais donner ceci 24 heures avant de choisir la réponse acceptée afin que j’ai plus de chance de choisir la meilleure réponse et pas seulement la première (même si la première réponse était plutôt bonne).

Voici comment vous pouvez générer une voyelle:

s=aeiou p=$(( $RANDOM % 5)) c=${s:$p:1} 

Utilisez la même méthode pour les consonnes.

Vous pouvez envelopper une petite fonction:

 function vowel() { s=aeoiu p=$(( $RANDOM % 5)) echo -n ${s:$p:1} } 

Et puis vous avez un bon motif pour générer la chaîne:

 s=`consonant; vowel; consonant; vowel; consonant; vowel` 

 #!/bin/bash # # cprint () { typ=$1 case $typ in v) alpha="aeiouy" ;; c) alpha="bcdfghjklmnpqrstvwxz" ;; V) alpha="AEIOUY" ;; C) alpha="BCDFGHJKLMNPQRSTVWXZ" ;; n) alpha="0123456789" ;; *) echo "** Undefined **" ; exit 1 ;; esac len=${#alpha} r=$((RANDOM%len)) echo -en ${alpha:r:1} } rprint () { code=$1 for i in $(seq 1 ${#code}) do c=${code:i-1:1} cprint $c done echo } rprint "cvccvc" rprint "cvcvvc" rprint "Cvccvc" rprint "Vccvcvc" rprint "Cvnvn" 

Cette solution est facilement changée pour imprimer une séquence différente, est facilement redéfinie, si vous n’êtes pas d’accord sur le y, vous avez besoin de äöü ou UPPERCASE et ainsi de suite.

Résultat expérimental:

 gohhec voteup Wuwjut Utpycoq Va6a6 

l’homme bash dit à propos de RANDOM:

Chaque fois que ce paramètre est référencé, un entier aléatoire compris entre 0 et 32767 …

Donc, si vous prenez le modulo RANDOM % X , et que X n’est pas une puissance de 2, les rests inférieurs auront de meilleures chances qu’une seule fois. Cela ne devrait pas être important dans votre cas, tant que vous ne vous rendez pas à l’extereme avec vos groupes de personnages ou ne l’utilisez pas dans des zones de haute sécurité. 🙂

Pour la postérité, j’inclurai le code avec lequel je me suis retrouvé. Il utilise principalement le code de Karoly Horvath, mais j’ai aussi ajouté quelques idées de “user unknown”:

 #!/bin/bash function v() { s=aeoiuy p=$((RANDOM % ${#s})) echo -n ${s:$p:1} } function c() { s=bcdfghjklmnpqrstvwxz p=$((RANDOM % ${#s})) echo -n ${s:$p:1} } function genPatternSsortingngs() { for i in $(eval echo {0..$1}); do echo `c;v;c;c;v;c;` done } genPatternSsortingngs $1; 

Bien que la commande suivante ne réponde pas à la question d’origine, il peut être utile dans d’autres cas de générer une chaîne aléatoire:

 for i in {1..15}; do # 15 random ssortingngs dd status=noxfer if=/dev/random bs=1 count=200 2>/dev/null | tr -dc 'a-z0-9A-Z' | # alphanumerics only cut -b1-10 | # length 10 tr 'AZ' 'az' # lowercase done | less