[Linux 셸 스크립트] 변환처리 - 014 값이 정수인지 확인해서 계산하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 변환처리 - 014 값이 정수인지 확인해서 계산하기

by 찬찬이 아빠 2021. 3. 5.
반응형
  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으로 정상적으로 계산 가능하므로 에러로 보지 않습니다.

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글