Comme vous l'avez probablement remarqué dans chacune des réponses, vous avez généralement ont pour "recourir à un programme".
Cependant, sans utiliser tout exécutable externe dans Bash et ksh :
string=''; for i in {0..31}; do string+=$(printf "%x" $(($RANDOM%16)) ); done; echo $string
dans zsh :
string=''; for i in {0..31}; do string+=$(printf "%x" $(($RANDOM%16)) ); dummy=$RANDOM; done; echo $string
Changez les minuscules x
dans la chaîne de format à une majuscule X
pour que les caractères alphabétiques hexagonaux soient en majuscules.
Voici une autre façon de le faire en Bash, mais sans boucle explicite :
printf -v string '%X' $(printf '%.2s ' $((RANDOM%16))' '{00..31})
Dans ce qui suit, "premier" et "second". printf
fait référence à l'ordre dans lequel ils sont exécutés plutôt qu'à l'ordre dans lequel ils apparaissent dans la ligne.
Cette technique utilise l'expansion des accolades pour produire une liste de 32 nombres aléatoires mod 16 suivis chacun d'un espace et d'un des nombres de la plage entre accolades suivi d'un autre espace (par ex. 11 00
). Pour chaque élément de cette liste, le premier printf
supprime tous les caractères sauf les deux premiers en utilisant sa chaîne de format ( %.2
) en laissant soit des chiffres simples suivis d'un espace chacun, soit deux chiffres. L'espace dans la chaîne de format garantit qu'il y a au moins un espace entre chaque chiffre de sortie.
La substitution de commande contenant la première printf
n'est pas cité, de sorte que le découpage des mots est effectué et que chaque nombre va au deuxième. printf
comme un argument distinct. Là, les nombres sont convertis en hexadécimal par la fonction %X
et ils sont ajoutés les uns aux autres sans espace (puisqu'il n'y en a pas dans la chaîne de format) et le résultat est stocké dans la variable nommée string
.
Quand printf
reçoit plus d'arguments que sa chaîne de format ne le permet, le format est appliqué à chaque argument tour à tour jusqu'à ce qu'ils soient tous consommés. S'il y a moins d'arguments, la chaîne de format non correspondante (portion) est ignorée, mais cela ne s'applique pas dans ce cas.
Je l'ai testé dans Bash 3.2, 4.4 et 5.0-alpha. Mais il ne fonctionne pas dans zsh (5.2) ou ksh (93u+) car RANDOM
n'est évalué qu'une seule fois dans l'expansion de l'accolade dans ces coquilles.
Notez qu'en raison de l'utilisation de l'opérateur mod sur une valeur allant de 0 à 32767, la distribution des chiffres en utilisant les extraits pourrait être faussée (sans parler du fait que les chiffres sont pseudo aléatoire en premier lieu). Cependant, comme nous utilisons le mod 16 et que 32768 est divisible par 16, cela ne posera pas de problème ici.
Dans tous les cas, la manière correcte de procéder est d'utiliser mktemp
dans le cas de Oleg Razgulyaev's réponse.