
Esta é uma continuação do meu tópico anterior: - Passando o comando de data para uma variável?
Ok, então, efetivamente, gostaria que /dev/urandom gerasse 4 dígitos para mim. E coloque-os em uma variável.
Aqui está um exemplo do meu script bash: -
#!/bin/bash
for (( c=0; c<=10; c++))
do
a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"
echo $a
done
A única razão pela qual desejo "ecoar" os resultados é para que eu possa realmente ver que /dev/urandom gerou 4 dígitos para mim corretamente.
Para o meu script bash que desejo fazer, preciso fazer isso programaticamente, pois desejo realizar outras operações nos resultados gerados.
Portanto, não preciso "ecoar" os resultados. assim éa="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"
Na verdade, colocando 4 dígitos aleatórios na variável "a"? quando eu ecoo "a" do meu script, recebo um console suspenso e preciso usar "CTRL + C" para trazer meu console de volta.
Tudo o que estou tentando fazer é colocar 4 dígitos aleatórios de /dev/urandom em uma variável.
Sou novo em scripts bash, então todos os conselhos são bem-vindos e agradeço antecipadamente por qualquer ajuda ou sugestão.
Responder1
Se você não precisa de segurança, você pode usar o recurso interno do bashRANDOM
variável. Para obter um número aleatório entre 0 e 9999 inclusive, $((RANDOM % 10000))
há uma pequena tendência para valores menores que 767, porque os valores de $RANDOM
são uniformes no intervalo [0, 32767]. Para obter uma distribuição uniforme e colocar zeros à esquerda:
while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}
Observe novamente que isso não se aplica em nenhum lugar em que a segurança seja uma preocupação. A saída de $RANDOM
não é imprevisível.
Se você precisa de segurança, este /dev/urandom
é o lugar certo para obter dados aleatórios. Chamar fold
é desnecessário na maioria das unidades atuais: você pode pegar 4 caracteres com head -c
.
a=$(</dev/urandom tr -dc 0-9 | head -c 4)
head -c
não é POSIX e não está presente no OpenBSD, mas está presente em outros BSD e no Linux (ambos com GNU coreutils e BusyBox).
Se você precisa de portabilidade para sistemas que não possuem head -c
, então fold -w 4 | head -n 1
é um bom substituto o padrão POSIX. Observe que você precisa da head
chamada, caso contrário, fold
continuará gerando linhas de 4 dígitos para sempre.
Responder2
fold
irá apenas dobrar o fluxo infinito de dígitos e, portanto, a
está sendo definido indefinidamente. Você precisará adicionar um comando de finalização, mais simples head
:
a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"
Basta comparar o comportamento desses dois comandos
tr -dc '[:digit:]' < /dev/urandom | fold -w 4
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1
O primeiro mostrará o fluxo infinito de números aleatórios de 4 dígitos, enquanto o segundo será abortado após uma linha.