今日、私のシェルスクリプトが時折早く終了することがわかりました。コードを確認した後、シェルスクリプトの先頭にset -e
があり、組み込み関数RANDOM
を使って乱数を生成していることがわかります。シェル - 組み込みのRANDOM関数が1を返すのはなぜですか?
set -e
で、スクリプト内のコマンドが0以外の値を返した場合、スクリプトはすぐに終了します。だから私はこのようなテストコードのスニペットを書く:
set -u
#set -e
for ((i=0; i < 100; i++))
do
index=$(expr ${RANDOM} % 16)
echo "RANDOM return $? , index is $index"
done
ご注意くださいコメントset -e
に、私はなるようにすると、いくつかのRANDOM return 1
が実際に存在する100の出力ラインを表示することを行います。たとえば、次のような結果が得られます。
RANDOM return 0 , index is 2
RANDOM return 0 , index is 10
RANDOM return 1 , index is 0
RANDOM return 0 , index is 9
RANDOM return 0 , index is 5
RANDOM return 0 , index is 9
RANDOM return 0 , index is 4
RANDOM return 0 , index is 6
RANDOM return 0 , index is 2
RANDOM return 0 , index is 4
RANDOM return 0 , index is 14
RANDOM return 0 , index is 6
RANDOM return 0 , index is 2
RANDOM return 1 , index is 0
RANDOM return 0 , index is 1
RANDOM return 0 , index is 8
...(more line)
参照してください。 RANDOMは1を返しますが、乱数を正しく生成します。そのため、シェルスクリプトが早期に終了するのはそのためです。 Pythonの乱数生成コードに切り替えると、スクリプトは正常に戻ります。
なぜRANDOM
が1を返しますか?
演算には 'expr'を使用しないでください。 'index = $(($ RANDOM%16))'を使ってください。 – chepner