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