The question is published on by Tutorial Guruji team.
I am trying to write a script to get a random, even hex number. I have found the the
openssl command has a convenient option for creating random hex numbers. Unfortunately, I need it to be even and my script has a type casting error somewhere. Bash thinks that my newly generated hex number is a string, so when I try to mod it by 2, the script fails. Here is what I have so far:
... hexVal="$(openssl rand -hex 1)" while [ `expr $hexVal % 2` -ne 0 ] do hexVal="$(openssl rand -hex 1)" done ...
I have tried various other combinations as well, to no avail. If someone could tell me what is wrong with my syntax, it would be greatly appreciated.
To generate an even random number in hex:
$ printf '%xn' $((2*$RANDOM)) d056
$ hexVal=$(printf '%xn' $((2*$RANDOM))) $ echo $hexVal f58a
To limit the output to smaller numbers, use modulo,
$ printf '%xn' $(( 2*$RANDOM % 256 )) 4a
If you really want to use a looping solution with
while hexVal="$(openssl rand -hex 1)" do ((0x$hexVal % 2 == 0)) && break done
0x signals that the number which follows is hex.
Rules for casting numbers in bash
Constants with a leading 0 are interpreted as octal numbers. A leading 0x or 0X denotes hexadecimal. Otherwise, numbers take the form [base#]n, where the optional base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base. If base# is omitted, then base 10 is used. When specifying n, the digits greater< than 9 are represented by the lowercase letters, the uppercase letters, @, and _, in that order. If base is less than or equal to 36, lowercase and uppercase letters may be used interchangeably to represent numbers between 10 and 35. [Emphasis added]