Як ви, мабуть, помітили з кожної з відповідей, ви, як правило, маєте "вдаватися до програми".
Однак, не використовуючи зовнішніх виконуваних файлів , в Bash і ksh:
string=''; for i in {0..31}; do string+=$(printf "%x" $(($RANDOM%16)) ); done; echo $string
в zsh:
string=''; for i in {0..31}; do string+=$(printf "%x" $(($RANDOM%16)) ); dummy=$RANDOM; done; echo $string
Змініть нижній регістр x
у рядку форматування на великийX
щоб алфавітні шістнадцяткові символи стали великими.
Ось ще один спосіб зробити це в Bash, але без явного циклу:
printf -v string '%X' $(printf '%.2s ' $((RANDOM%16))' '{00..31})
Далі "перший" та "другий" printf
стосуються порядку, в якому вони виконуються, а не порядку, в якому вони з'являються в рядку.
Ця техніка використовує розширення фігурних дужок для створення списку з 32 випадкових чисел мод 16, кожному з яких слід пробіл та одне з чисел у діапазоні в фігурних дужках, після чого інший пробіл (наприклад 11 00
). Для кожного елемента цього списку перший printf
видаляє всі символи, крім перших двох, за допомогою його рядка формату (%.2
), залишаючи одну цифру, а потім пробіл кожну або дві цифри. Пробіл у рядку формату гарантує, що тоді між кожним вихідним номером є принаймні один пробіл.
Заміна команди, що містить першу printf
, не цитується, тому виконується розбиття слів, і кожне число переходить до другого printf
як окремий аргумент. Там числа перетворюються у шістнадцяткові за допомогою %X
рядка формату, і вони додаються одне до одного без пробілів (оскільки їх у рядку формату немає), а результат зберігається у змінній з іменемstring
.
Коли printf
отримує більше аргументів, ніж для його рядка формату, формат по черзі застосовується до кожного аргументу, поки всі вони не будуть спожиті. Якщо аргументів менше, нерівний рядок формату (частина) ігнорується, але в цьому випадку це не застосовується.
Я тестував його в Bash 3.2, 4.4 та 5.0-alpha. Але це не працює у zsh (5.2) або ksh (93u +), тому що RANDOM
оцінюється лише один раз при розгортанні фігурної дужки в цих оболонках.
Зверніть увагу, що через використання оператора мода для значення, яке варіюється від 0 до 32767, розподіл цифр за допомогою фрагментів може бути перекошеним (не кажучи вже про те, що числа в першу чергу є псевдовипадковими ). Однак, оскільки ми використовуємо мод 16 і 32768, ділиться на 16, це не буде проблемою тут.
У будь-якому випадку, правильним способом цього є використання, mktemp
як у відповіді Олега Разгуляєва .