whileループとモジュロのためのシェルスクリプトの正しい型変換

whileループとモジュロのためのシェルスクリプトの正しい型変換

私はランダムでさえ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

関連情報