私はランダムでさえ16進数を取得するスクリプトを書こうとしています。私はこのopenssl
コマンドにランダムな16進数を生成する便利なオプションがあることを発見しました。残念ながら、私はそれが均一でなければならず、私のスクリプトにどこかに型変換エラーがあります。 Bashは新しく作成された16進数を文字列と見なすため、これを2に変更しようとするとスクリプトは失敗します。これが私が今まで持っているものです:
...
hexVal="$(openssl rand -hex 1)"
while [ `expr $hexVal % 2` -ne 0 ]
do
hexVal="$(openssl rand -hex 1)"
done
...
私はまた役に立たないさまざまな異なった組合せを試みました。誰かが私の構文にどんな問題があるのか教えてくれたらとても感謝します。
答え1
バッシュを使って
16進偶数乱数を生成するには:
$ printf '%x\n' $((2*$RANDOM))
d056
または:
$ hexVal=$(printf '%x\n' $((2*$RANDOM)))
$ echo $hexVal
f58a
出力をより小さい数に制限するには、モジュロを使用します%
。
$ printf '%x\n' $(( 2*$RANDOM % 256 ))
4a
opensslの使用
ループソリューションを実際に使用するには、次の手順を実行しますopenssl
。
while hexVal="$(openssl rand -hex 1)"
do
((0x$hexVal % 2 == 0)) && break
done
この0x
信号は、次の数字が16進数であることを示します。
Bashの数値変換規則
からman bash
:
0で始まる定数は8進数として解釈されます。 前に0xまたは0Xがある場合は、16進数を表します。 それ以外の場合、数値は [base#]n 形式を取ります。ここで、オプションの下数は算術下数を表す2〜64の10進数で、nはその下数の数です。 base#を省略すると、base 10が使用されます。 n を指定すると、9 より大きい数字は小文字、大文字、@、_ の順に表示されます。下数が 36 以下の場合は、小文字と大文字を入れ替えて使用して、10 ~ 35 の数字を表すことができます。 [強調する]
答え2
これはどうですか?
printf "%0x\n" $(( ($RANDOM*2) & 0xff))
答え3
hexVal=1
while (( 16#$hexVal % 2))
do
hexVal=$(openssl rand -hex 1)
done
printf "%x [%d]\n" 0x$hexVal 0x$hexVal