ランダムな16進数を取得するスクリプトを作成しようとしています。 openssl
コマンドには、ランダムな16進数を作成するための便利なオプションがあることがわかりました。残念ながら、それを均等にする必要があり、スクリプトのどこかに型キャストエラーがあります。 Bashは、新しく生成された16進数を文字列と見なしているため、2で変更しようとすると、スクリプトが失敗します。これが私がこれまでに持っているものです:
...
hexVal="$(openssl Rand -hex 1)"
while [ `expr $hexVal % 2` -ne 0 ]
do
hexVal="$(openssl Rand -hex 1)"
done
...
私は他のさまざまな組み合わせも試しましたが、役に立ちませんでした。誰かが私の構文の何が悪いのか教えてくれたら、それは大いにありがたいです。
16進数で偶数の乱数を生成するには:
$ printf '%x\n' $((2*$RANDOM))
d056
または:
$ hexVal=$(printf '%x\n' $((2*$RANDOM)))
$ echo $hexVal
f58a
出力をより小さな数に制限するには、モジュロ%
を使用します。
$ printf '%x\n' $(( 2*$RANDOM % 256 ))
4a
本当にopenssl
でループソリューションを使用したい場合:
while hexVal="$(openssl Rand -hex 1)"
do
((0x$hexVal % 2 == 0)) && break
done
0x
は、続く番号が16進数であることを示します。
man bash
から:
先頭に0が付いている定数は、8進数として解釈されます。 先頭の0xまたは0Xは16進数を示します。それ以外の場合、数値は[base#] nの形式になります。ここで、オプションの基数は2から64までの10進数で、算術基数を表します。nは次の数値です。そのベース。 base#を省略すると、base10が使用されます。 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