2016-09-29 3 views
0

오늘 저는 쉘 스크립트가 때때로 빠져 나가는 것을 발견했습니다. 코드를 확인한 후, 나는 셸 스크립트의 머리에 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을 반환합니까?

+0

산술에'expr'을 사용하지 마십시오. 'index = $ (($ RANDOM % 16))'를 사용하십시오. – chepner

답변

7

$?은 마지막으로 명령의 상태입니다. $RANDOM은 명령이 아니므로이 값을 평가해도 $?에 영향을주지 않습니다. ($RANDOM는 평가 때 0에서 32767 사이의 임의의 정수를 산출는 "쉘 매개 변수"또는 변수입니다.)

당신이보고있는 $? 값은 명령 expr ${RANDOM} % 16을 실행 한 결과이다. 식을 평가 한 결과가 0 null의 경우, 또는 $RANDOM % 16 0 (시간의 6.25 %) 때마다 당신이 1의 상태를 얻을 수 있습니다 있도록

expr 명령은 1의 상태를 반환합니다. 당신이 set -e을했습니다 당신이 쉘을 종료하지 않고 실패 할 수 있습니다 명령을 실행하려면

% expr 1 % 16 ; echo "\$?=$?" 
1 
$?=0 
% expr 0 % 16 ; echo "\$?=$?" 
0 
$?=1 

, 당신은 || true 같은 것을 추가 할 수 있습니다. || 접두어가 조건으로 사용되기 때문에 오류는 조건을 false로 만듭니다.

index=$(expr ${RANDOM} % 16) || true 
echo "Status of expr is $?, index is $index" 
관련 문제