これは前のトピックに対するフォローアップです。 日付コマンドを変数に渡しますか?
まあ、私は/ 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 -c
POSIXではなくOpenBSDには存在しませんが、他のBSDとLinux(両方ともGNU coreutilsとBusyBoxを使用)には存在します。
head -c
POSIX標準を持たないシステムに移植する必要がある場合は、fold -w 4 | head -n 1
POSIX標準が良い選択肢です。呼び出す必要があります。head
それ以外の場合、fold
4桁の出力ラインは永久に維持されます。
答え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行後に終了します。