
Dies ist eine Fortsetzung meines vorherigen Threads: - Datumsbefehl an eine Variable übergeben?
Ok, also ich möchte, dass /dev/urandom 4 Ziffern für mich generiert. Und sie in eine Variable einfügt.
Hier ist ein Beispiel meines Bash-Skripts: -
#!/bin/bash
for (( c=0; c<=10; c++))
do
a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"
echo $a
done
Der einzige Grund, warum ich die Ergebnisse „echoen“ möchte, besteht darin, dass ich tatsächlich sehen kann, dass /dev/urandom die 4 Ziffern korrekt für mich generiert hat.
Für das Bash-Skript, das ich erstellen möchte, muss ich dies programmgesteuert tun, da ich mit den generierten Ergebnissen weitere Operationen durchführen möchte.
Ich muss die Ergebnisse also nicht „wiedergeben“.a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"
Tatsächlich 4 zufällige Ziffern in die Variable „a“ einfügen? Wenn ich „a“ aus meinem Skript wiedergebe, bleibt die Konsole einfach hängen und ich muss „STRG+C“ verwenden, um meine Konsole wiederherzustellen.
Ich versuche lediglich, 4 zufällige Ziffern aus /dev/urandom in eine Variable einzufügen.
Ich bin neu im Bereich Bash-Skripting, daher sind alle Ratschläge willkommen und ich danke Ihnen im Voraus für jegliche Hilfe oder Vorschläge.
Antwort1
Wenn Sie keine Sicherheit benötigen, können Sie die in Bash integrierteRANDOM
Variable. Um eine Zufallszahl zwischen 0 und 9999 einschließlich zu erhalten, $((RANDOM % 10000))
ergibt sich eine kleine Tendenz zu Werten unter 767, da die Werte $RANDOM
im Bereich [0, 32767] gleichmäßig verteilt sind. Um eine gleichmäßige Verteilung zu erhalten und führende Nullen zu setzen:
while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}
Beachten Sie erneut, dass dies nicht überall dort anwendbar ist, wo Sicherheit ein Problem darstellt. Die Ausgabe $RANDOM
ist nicht unvorhersehbar.
Wenn Sie Sicherheit benötigen, /dev/urandom
ist dies der richtige Ort, um zufällige Daten abzurufen. fold
Bei den meisten aktuellen Unix-Versionen ist ein Aufruf nicht erforderlich: Sie können mit 4 Zeichen abrufen head -c
.
a=$(</dev/urandom tr -dc 0-9 | head -c 4)
head -c
ist nicht POSIX und nicht auf OpenBSD vorhanden, aber es ist auf anderen BSDs und auf Linux vorhanden (sowohl mit GNU Coreutils als auch mit BusyBox).
Wenn Sie Portabilität auf Systeme benötigen, die nicht über verfügen head -c
, ist dies ein guter Ersatz, der dem POSIX-Standard entspricht. Beachten Sie jedoch, dass Sie den Aufruf fold -w 4 | head -n 1
benötigen , da sonst für immer Zeilen mit 4 Ziffern ausgegeben werden.head
fold
Antwort2
fold
wird einfach den unendlichen Zahlenstrom falten und a
ist somit auf unbestimmte Zeit definiert. Sie müssen einen Beendigungsbefehl hinzufügen, am einfachsten head
:
a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"
Vergleichen Sie einfach das Verhalten dieser beiden Befehle
tr -dc '[:digit:]' < /dev/urandom | fold -w 4
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1
Das erste zeigt einen unendlichen Strom vierstelliger Zufallszahlen, während das zweite nach einer Zeile abbricht.