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

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

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

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

3 Solutions collect form web for “Правильное литье типов в сценарии оболочки для использования с циклом while и модулем”

Использование 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 
  • Модернизирован, чтобы проверить ветвь по ошибке в debian ... как я могу вернуться к стабильной?
  • Если условие не работает в скрипте над ssh
  • shell scripting - несколько тестов равенства в одном выражении if
  • Невозможно сравнить результат lsb_release с строкой в ​​Bash
  • Как узнать, существует ли каталог?
  • Как использовать отрицание команды в цикле while с grep в сценарии оболочки?
  • Как сравнить версию программы в сценарии оболочки?
  • Использование -n и -z в тестировании встроено - Bash
  • Некоторые ошибки возникли, когда я установил lucene, модуль perl!
  • Linux и Unix - лучшая ОС в мире.