Estou tentando imprimir uma n
palavra de letra aleatória, onde insiro n
a partir da própria linha de comando, mas por algum motivo meu script está me dando a mesma resposta todas as vezes ao usar o mesmo valor para n
.
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
Estou chamando meu script como:
$ bash var3.sh 5
étude # always the same output when using 5
$ bash var3.sh 3
zoo # always the same output when using 3
onde var3.sh
é o nome do meu script e 5 é o comprimento da palavra que quero imprimir aleatoriamente.
Como faço para imprimir uma palavra verdadeiramente aleatória?
Não. Mas $RANDOM retorna números grandes (entre 0 e 32767) que, especialmente para palavras de comprimento limitado, mostram o mesmo resultado, pois a
head
porção provavelmente retorna todos os resultados do grep (para 3, existem apenas 819 correspondências em my/usr/share/dict/words
).A melhor solução pode ser embaralhar os resultados:
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
onde
-R
significa (uma extensão--random-sort
GNU ).sort
Um método simples para imprimir uma palavra arbitrária de letras numéricas usa
shuf
:O
shuf
comando gera uma permutação aleatória da entrada e o-n1
sinalizador informa a saída apenas do primeiro item desse resultado.Como outros apontaram, o principal problema com seu código é que, na
$RANDOM
maioria das vezes, será um valor muito maior do que o número de palavras de um determinado comprimento.Usando
awk
apenas:O programa lê todas as linhas de um determinado arquivo de um determinado comprimento. Estes são armazenados na matriz
words
.Ao final, um elemento aleatório deste array é selecionado e impresso.