Intereting Posts
Как создать .deb, который имеет дело с различными системами инициализации Как работают несколько блоков в AWK? Не удалось распознать старые интерфейсы после обновления материнской платы Редактирование и компиляция файлов на удаленном сервере с помощью Vim Regex: все греческие буквы с 5 уникальными буквами (это означает, что каждая буква появляется только один раз) Полноэкранные игры с моей настройкой с двумя мониторами xrandr Панели LX загадочно после 6 перезапуска Использование Linux и CPU Проверьте содержимое файла, ищущего повреждение, размер файла указывает размер «ноль» Можно ли добавлять последовательные столбцы в AWK Поддерживает ли Gnome Keyring ключи OpenSSH нового формата? wget не разрешает относительные ссылки должным образом? zsh завершение по истории не работает Могу ли я использовать символическую ссылку в качестве службы systemd? Какие альтернативы существуют для ipset для блокировки больших наборов IP-адресов / диапазонов адресов?

Правильное литье типов в сценарии оболочки для использования с циклом while и модулем

Я пытаюсь написать сценарий, чтобы получить случайный, даже шестнадцатеричный номер. Я обнаружил, что команда openssl имеет удобный вариант для создания случайных шестнадцатеричных чисел. К сожалению, мне нужно, чтобы он был ровным, а у моего скрипта где-то была ошибка при произведении. Баш считает, что мой новый шестизначный номер является строкой, поэтому, когда я пытаюсь изменить его на 2, скрипт терпит неудачу. Вот что я имею до сих пор:

 ... hexVal="$(openssl rand -hex 1)" while [ `expr $hexVal % 2` -ne 0 ] do hexVal="$(openssl rand -hex 1)" done ... 

Я также пробовал различные другие комбинации, но безрезультатно. Если кто-то может сказать мне, что не так с моим синтаксисом, было бы весьма полезно.

Использование bash

Чтобы генерировать четное случайное число в шестнадцатеричном виде:

 $ printf '%x\n' $((2*$RANDOM)) d056 

Или:

 $ hexVal=$(printf '%x\n' $((2*$RANDOM))) $ echo $hexVal f58a 

Чтобы ограничить вывод на меньшие номера, используйте modulo, % :

 $ printf '%x\n' $(( 2*$RANDOM % 256 )) 4a 

Использование openssl

Если вы действительно хотите использовать looping-решение с openssl :

 while hexVal="$(openssl rand -hex 1)" do ((0x$hexVal % 2 == 0)) && break done 

Сигнал 0x указывает, что число, которое следует ниже, равно шестнадцатеричному.

Правила для литья чисел в bash

От man bash :

Константы с ведущим 0 интерпретируются как восьмеричные числа. Ведущий 0x или 0X обозначает шестнадцатеричный. В противном случае числа принимают форму [base #] n, где необязательная база представляет собой десятичное число от 2 до 64, представляющее арифметическую базу, а n – число в этой базе. Если база # опущена, то используется база 10. При указании n цифры больше <9 представлены строчными буквами, буквами верхнего регистра, @ и _ в этом порядке. Если основание меньше или равно 36, строчные и прописные буквы могут использоваться взаимозаменяемо, чтобы представлять числа от 10 до 35. [Акцент добавлен]

А как насчет этого?

 printf "%0x\n" $(( ($RANDOM*2) & 0xff)) 
 hexVal=1 while (( 16#$hexVal % 2)) do hexVal=$(openssl rand -hex 1) done printf "%x [%d]\n" 0x$hexVal 0x$hexVal