ランダムで0~99の整数を生成するシェルスクリプトです。
ランダム値のタネとして、乱数ジェネレーターの/dev/urandomを使います。
3行目がこのシェルスクリプトのキモになります。
cat /dev/urandom は、ランダムの文字記号数字を出力します。
tr -dc [:digit:] は、ランダムで出力した文字記号数字から数字のみを取り出します。
fold -w2 は、取り出した数字列を1行につき2カラム(文字)ずつに分割します。
head -1 は、出力された行のうち、最初の1行のみ表示します。
4行目は、1で割ることにより、08のように先頭に0(ゼロ)がつく値の場合に、先頭の0を削除します。
1 2 3 4 |
#!/bin/bash number=$(cat /dev/urandom | tr -dc [:digit:] | fold -w2 | head -1) expr "$number" / 1 |
メモ
同じようにランダム値を生成する/dev/randomもありますが、/dev/urandomの方が処理が速いため、/dev/urandomを使います。
実行例
$ ./random1.sh
27
上記のサンプルプログラムは、0~99までの乱数を出力するシェルスクリプトですが、1~16までの乱数を出力する場合は、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash readonly MAX_NUMBER=16 while true do number=$(cat /dev/urandom | tr -dc [:digit:] | fold -w2 | head -1) number=$( expr "$number" / 1 ) if (( 0 < number && number <= MAX_NUMBER )) then break fi done echo "$number" |
実行例
$ ./random2.sh
3