오늘 저는 쉘 스크립트가 때때로 빠져 나가는 것을 발견했습니다. 코드를 확인한 후, 나는 셸 스크립트의 머리에 set -e
이 있고 난수를 생성하기 위해 내장 함수 RANDOM
을 사용하고 있기 때문에 그 코드를 찾았습니다.쉘 - 내장 RANDOM 함수가 1을 반환하는 이유는 무엇입니까?
set -e
을 사용하면 스크립트의 명령이 0이 아닌 값을 반환하면 스크립트가 즉시 종료됩니다. 그래서 나는이 같은 테스트 코드의 조각 쓰기 다음 set -e
주석에
set -u
#set -e
for ((i=0; i < 100; i++))
do
index=$(expr ${RANDOM} % 16)
echo "RANDOM return $? , index is $index"
done
에주의를, 그래서 일부 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을 반환하지만 난수를 올바르게 생성하므로 내 셸 스크립트가 일찍 종료됩니다. 파이썬의 난수 생성 코드로 전환 한 후, 스크립트는 정상으로 되돌아갑니다.
왜 RANDOM
은 1을 반환합니까?
산술에'expr'을 사용하지 마십시오. 'index = $ (($ RANDOM % 16))'를 사용하십시오. – chepner