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 xin 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 printfbeziehen 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 printfalle 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, printfwird nicht in Anführungszeichen gesetzt, sodass eine Wortaufteilung durchgeführt wird und jede Zahl printfals separates Argument an die zweite geht . Dort werden die Zahlen durch die Formatzeichenfolge in hexadezimal %Xkonvertiert und ohne Leerzeichen aneinander angehängt (da die Formatzeichenfolge keine enthält). Das Ergebnis wird in der genannten Variablen gespeichert string.
Wenn printfmehr 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 RANDOMin 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, mktempwie in der Antwort von Oleg Razgulyaev .