Wie Sie wahrscheinlich bei jeder Antwort bemerkt haben , müssen Sie im Allgemeinen "auf ein Programm zurückgreifen".
Ohne externe ausführbare Dateien in Bash und ksh:
string=''; for i in {0..31}; do string+=$(printf "%x" $(($RANDOM%16)) ); done; echo $string
in zsh:
string=''; for i in {0..31}; do string+=$(printf "%x" $(($RANDOM%16)) ); dummy=$RANDOM; done; echo $string
Ändern Sie die Kleinbuchstaben x
in der Formatzeichenfolge in Großbuchstaben X
, um die alphabetischen Hex-Zeichen in Großbuchstaben zu setzen.
Hier ist eine andere Möglichkeit, dies in Bash zu tun, jedoch ohne explizite Schleife:
printf -v string '%X' $(printf '%.2s ' $((RANDOM%16))' '{00..31})
Im Folgenden printf
beziehen sich "erste" und "zweite" auf die Reihenfolge, in der sie ausgeführt werden, und nicht auf die Reihenfolge, in der sie in der Zeile erscheinen.
Diese Technik verwendet die Klammererweiterung, um eine Liste von 32 Zufallszahlen mod 16 zu erstellen, gefolgt von einem Leerzeichen und einer der Zahlen im Bereich in geschweiften Klammern, gefolgt von einem anderen Leerzeichen (z 11 00
. B. ). Für jedes Element dieser Liste entfernt das erste printf
alle bis auf die ersten beiden Zeichen mit seiner Formatzeichenfolge ( %.2
), wobei entweder einzelne Ziffern gefolgt von einem Leerzeichen oder zwei Ziffern übrig bleiben. Das Leerzeichen in der Formatzeichenfolge stellt sicher, dass zwischen jeder Ausgabenummer mindestens ein Leerzeichen steht.
Die Befehlssubstitution, die die erste enthält, printf
wird nicht in Anführungszeichen gesetzt, sodass eine Wortaufteilung durchgeführt wird und jede Zahl printf
als separates Argument an die zweite geht . Dort werden die Zahlen durch die Formatzeichenfolge in hexadezimal %X
konvertiert und ohne Leerzeichen aneinander angehängt (da die Formatzeichenfolge keine enthält). Das Ergebnis wird in der genannten Variablen gespeichert string
.
Wenn printf
mehr Argumente empfangen werden, als die Formatzeichenfolge berücksichtigt, wird das Format nacheinander auf jedes Argument angewendet, bis alle verbraucht sind. Wenn weniger Argumente vorhanden sind, wird die nicht übereinstimmende Formatzeichenfolge (Teil) ignoriert, dies gilt jedoch in diesem Fall nicht.
Ich habe es in Bash 3.2, 4.4 und 5.0-alpha getestet. In zsh (5.2) oder ksh (93u +) funktioniert dies jedoch nicht, da die Klammererweiterung RANDOM
in diesen Shells nur einmal ausgewertet wird.
Beachten Sie, dass aufgrund der Verwendung des Mod-Operators für einen Wert zwischen 0 und 32767 die Verteilung der Ziffern mithilfe der Snippets verzerrt sein kann (ganz zu schweigen von der Tatsache, dass die Zahlen in erster Linie pseudozufällig sind ). Da wir jedoch Mod 16 verwenden und 32768 durch 16 teilbar ist, ist dies hier kein Problem.
In jedem Fall ist der richtige Weg, dies zu tun, mktemp
wie in der Antwort von Oleg Razgulyaev .