
Esta es una continuación de mi hilo anterior:- ¿Pasar el comando de fecha a una variable?
Bien, efectivamente me gustaría que /dev/urandom generara 4 dígitos para mí. Y colóquelos en una variable.
Aquí hay un ejemplo de mi script bash: -
#!/bin/bash
for (( c=0; c<=10; c++))
do
a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"
echo $a
done
La única razón por la que deseo hacer eco de los resultados es para poder ver que /dev/urandom ha generado 4 dígitos correctamente.
Para mi script bash que deseo crear, necesito hacerlo mediante programación ya que deseo realizar más operaciones en los resultados generados.
Así que no necesito "hacer eco" de los resultados. Asi esa="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"
¿Realmente colocando 4 dígitos aleatorios en la variable "a"? cuando hago eco de "a" de mi secuencia de comandos, aparece una consola bloqueada y tengo que usar "CTRL+C" para recuperar mi consola.
Todo lo que intento hacer es colocar 4 dígitos aleatorios de /dev/urandom en una variable.
Soy nuevo en bash scripting, así que todos los consejos son bienvenidos y gracias de antemano por cualquier ayuda o sugerencia.
Respuesta1
Si no necesita seguridad, puede usar la función integrada de bash.RANDOM
variable. Obtener un número aleatorio entre 0 y 9999 inclusive, $((RANDOM % 10000))
genera un pequeño sesgo hacia valores menores que 767, porque los valores de $RANDOM
son uniformes en el rango [0, 32767]. Para obtener una distribución uniforme y poner ceros a la izquierda:
while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}
Tenga en cuenta nuevamente que esto no se aplica en ningún lugar donde la seguridad sea una preocupación. El resultado $RANDOM
no es impredecible.
Si necesita seguridad, este /dev/urandom
es el lugar adecuado para obtener datos aleatorios. Las llamadas fold
son innecesarias en la mayoría de los Unices actuales: puedes capturar 4 caracteres con head -c
.
a=$(</dev/urandom tr -dc 0-9 | head -c 4)
head -c
no es POSIX y no está presente en OpenBSD, pero está presente en otros BSD y en Linux (ambos con GNU coreutils y BusyBox).
Si necesita portabilidad a sistemas que no la tienen head -c
, entonces fold -w 4 | head -n 1
un buen reemplazo es el estándar POSIX. Solo tenga en cuenta que necesita la head
llamada; de lo contrario, fold
seguirá generando líneas de 4 dígitos para siempre.
Respuesta2
fold
simplemente doblará el flujo infinito de dígitos y, por lo tanto, a
se definirá indefinidamente. Necesitará agregar un comando de terminación, el más simple head
:
a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"
Simplemente compare el comportamiento de estos dos comandos.
tr -dc '[:digit:]' < /dev/urandom | fold -w 4
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1
El primero mostrará el flujo infinito de números aleatorios de 4 dígitos, mientras que el segundo abortará después de una línea.