/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)"

実際に 4 つのランダムな数字を変数「a」に配置するのですか? スクリプトから「a」をエコーすると、コンソールがハングアップしてしまい、「CTRL+C」を使用してコンソールを戻す必要があります。

私がやろうとしているのは、/dev/urandom からランダムな 4 桁の数字を変数に配置することだけです。

私は bash スクリプトの初心者なので、あらゆるアドバイスを歓迎します。また、ご助力やご提案をいただければ幸いです。

答え1

セキュリティが必要ない場合は、bashの組み込みのRANDOM変数。0から9999までの乱数を取得すると、$((RANDOM % 10000))767未満の値にわずかに偏りが生じます。これは、の値が$RANDOM範囲[0, 32767]内で均一であるためです。均一分布を取得し、先頭にゼロを付けるには、次のようにします。

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

再度注意しますが、これはセキュリティが懸念される場合には適用されません。 からの出力は$RANDOM予測不可能ではありません。

セキュリティが必要な場合は、 が/dev/urandomランダム データを取得するのに適した場所です。 の呼び出しはfold、現在のほとんどの unice では不要です。 で 4 文字を取得できますhead -c

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

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

がないシステムへの移植性が必要な場合はhead -cfold -w 4 | head -n 1が POSIX 標準の適切な代替手段です。 のhead呼び出しが必要であることに注意してください。そうしないと、fold4 桁の行が永久に出力され続けます。

答え2

fold無限の数字列を折り返すだけなので、a無期限に定義されます。終了コマンドを追加する必要があります。最も単純なのは、次のとおりです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 行後に中止します。

関連情報