
これは前回のスレッドの続きです:- 日付コマンドを変数に渡しますか?
わかりました。つまり、/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 -c
POSIX ではなく、OpenBSD にも存在しませんが、他の BSD および Linux (GNU coreutils および BusyBox の両方) には存在します。
がないシステムへの移植性が必要な場合はhead -c
、fold -w 4 | head -n 1
が POSIX 標準の適切な代替手段です。 のhead
呼び出しが必要であることに注意してください。そうしないと、fold
4 桁の行が永久に出力され続けます。
答え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 行後に中止します。