/dev/urandomの内容を変数に入れますか?

/dev/urandomの内容を変数に入れますか?

これは前のトピックに対するフォローアップです。 日付コマンドを変数に渡しますか?

まあ、私は/ dev / urandomが4桁の数字を生成したいと思います。そして変数に入れてみてください。

以下は私のbashスクリプトの例です。

#!/bin/bash
for (( c=0; c<=10; c++))
do
        a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

        echo $a
done

私が結果を「エコー」したい唯一の理由は、/dev/urandomが私に4桁の数字を正しく生成したかどうかを実際に見ることができるからです。

私が作成したいbashスクリプトの場合は、生成された結果をさらに操作したいので、プログラムでこれを行う必要があります。

したがって、結果を「エコー」する必要はありません。これもこうだa="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

実際に変数"a"に4つの乱数を入れると?スクリプトで「a」をエコーするとコンソールが停止し、コンソールを復元するには「CTRL + C」を使用する必要があります。

私がしたいのは、/dev/urandomの4つの乱数を変数に入れることです。

私はbashスクリプトが初めてなので、すべての提案を歓迎し、助けや提案に感謝します。

答え1

セキュリティが不要な場合は、bashの組み込み機能を使用できますRANDOM変える0から9999(含む)の乱数を得るには、値が[0,32767]の範囲で均一である$((RANDOM % 10000))ため、767より小さい値に対してわずかな偏差が発生します。$RANDOM均一な分布を取得し、前にゼロを配置するには、次のようにします。

while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}

もう一度申し上げますが、これはセキュリティが関係する場所には適用されません。出力を$RANDOM予測できません。

本当にセキュリティが必要な場合、ここが/dev/urandomランダムなデータを取得するのに最適な場所です。ほとんどの最新の unice では呼び出しはfold必要ありません。を使用して4文字を取得できますhead -c

a=$(</dev/urandom tr -dc 0-9 | head -c 4)

head -cPOSIXではなくOpenBSDには存在しませんが、他のBSDとLinux(両方ともGNU coreutilsとBusyBoxを使用)には存在します。

head -cPOSIX標準を持たないシステムに移植する必要がある場合は、fold -w 4 | head -n 1POSIX標準が良い選択肢です。呼び出す必要があります。headそれ以外の場合、fold4桁の出力ラインは永久に維持されます。

答え2

fold数字の無限の流れだけが折り畳まれ、したがってa無限に定義されます。最も簡単な方法でkillコマンドを追加する必要がありますhead

 a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"

これら2つのコマンドの動作を比較してみてください。

tr -dc '[:digit:]' < /dev/urandom | fold -w 4  
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1

最初は4桁の乱数からなる無限ストリームを示し、2番目は1行後に終了します。

関連情報