- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: test, expr
키워드: 숫자 확인, 인수 확인, 에러 처리
사용처: expr 명령어 등으로 계산하기 전에 변수값이 정수인지 확인하고 싶을 때
실행예제
$ ./int-check.sh 100a
Argument is not Integer.
$ ./int-check.sh 100
Argument is Integer.
110
스크립트
#!/bin/sh
# 인수가 정수인지 확인
test "$1" -eq 0 2>/dev/null #------------- 1
if [ $? -lt 2 ]; then #------------------- 2
echo "Argument is Integer"
expr 10 + $1
else
echo "Argument is not Integer."
exit 1
fi
해설
이 스크립트는 명령행 인수로 지정한 정수값에 10을 더한 값을 돌려줍니다. 정수 이외의 값이 지정되면 “Argument is not Integer.”라고 표시하고 에러를 냅니다. 덧셈, 뺄셈 같은 사칙 연산을 expr 명령어로 할 수 있습니다. 곱셈을 할 땐 *(애스터리스크)가 셸에서 해석되지 않도록 \ 기호로 이스케이프해야 합니다.
expr $i + $j # 더하기
expr $1 - $j # 빼기
expr $i \* $j # 곱하기
expr $i / $j # 나누기
expr 명령어는 소수점에 대응하지 않으므로 정수가 아닌 값을 사칙 연산하면 에러가 발생합니다. 따라서 명령어를 실행하기 전에 변수가 바른 값인지 확인하고 싶을 때가 있습니다. 특히 이 예제처럼 사용자가 입력한 값으로 처리하는 경우에 입력값을 제대로 확인하지 않으면 예상과 다른 결과가 나오게 됩니다.
따라서 1
에서 인수 확인을 합니다. test 명령어를 써서 명령행 인수($1)
가 0과 같은지 -eq 연산자로 확인합니다. test 명령어 출력 결과 자체는 필요 없으므로 표준 에러 출력은 /dev/null로 리다이렉트해서 버립니다. 1
처리의 종료 스테이터스($?)는 다음과 같습니다.
- 명령행 인수가 0과 같으면 0
- 명령행 인수가 0이 아니면 1
- 명령행 인수가 0과 비교 불가능한 문자열이면 2
따라서 2
에서 종료 스테이터스를 비교해서 2보다 작으면(-lt) 정수로 보고 그대로 계산을하고, 아니면 정수가 아니라고 판단해서 에러를 내고 종료합니다.
주의사항
- 이 스크립트는 “0000” 같은 문자열 값을 expr 명령어에서 정수 0으로 정상적으로 계산 가능하므로 에러로 보지 않습니다.