-
쉘스크립트에서 안전하게 문자열(string)을 비교하는 방법Programmer/Computer Skills 2016. 9. 30. 16:50
두 문자열을 안전하게 비교할 때는
if [ x$A == x$B ]; then echo $1 fi
또는
if [ "$A" == "$B" ]; then echo $1 fi
를 사용한다.
빈 문자열인지 안전하게 검사하는 방법은
if [ x$A == x ]; then echo $1 fi
또는
if [ "$A" == "" ]; then echo $1 fi
내지는
if [ -z "$A" ]; then echo $1 fi
이 있다.
x와 같은 문자를 추가하거나 인용문자(")로 둘러싸지 않으면
빈문자열이거나 옵션 형태의 문자열이 들어오면 오류가 발생할 수 있다.아래와 같이 STRING을 따옴표로 둘러싸지 않으면
[ -z STRING ]
STRING이 "-n", "-p" 등을 포함한 옵션 형태의 문자열이 들어오면 문제가 되는 경우가 있었다.
이것을 이해하려면, '[ '이 사실은 'ls', 'rm'과 같은 명령어라는 것을 알아야 한다.
즉, '[ ... ]'는 마치 쉘의 문법처럼 보이나 사실은 일반 명령어이다.$ ls -l /usr/bin/[ -rwxr-xr-x 1 root root 51920 Feb 18 2016 /usr/bin/[*
'['는 끝에 오는 ']'를 연산의 내용으로 취급하지 않는다.
따라서
[ -z STRING ]
는
test -z STRING
과 같다.
검사할 문자열이 "-n" 일 경우
test -z $A
이
test -z -n
으로 처리될 수 있다.
옵션에 따라서 옛날 버젼의 test에서는 문제가 될 수 있다.첫번째 인자가 빈문자열인 경우,
[ $A == $B ]
는
[ == $B ]
으로 평가되어 실행된다.
'=='의 왼쪽 피연산자가 존재하지 않음으로, "==: unexpected operator"와 같은 오류를 발생한다.Bash를 대상으로 작성한다면, 이런 문제에서 좀 더 자유로운 확장 검사 명령어인 '[['를 사용하는 것을 추천한다.
여기서 예로 든 어떤 방법을 사용하다고 하더라고 문제가 되지 않는다.
확장 검사 명령어에 대한 것은 아래 참고 자료 링크를 참고한다.참고 자료:
KLDP 포럼: bash스크립트에서 빈문자열 체크 방법
확장 검사 명령어'Programmer > Computer Skills' 카테고리의 다른 글
'ps aux'와 'ps -ef'의 차이 (0) 2018.02.13 Ubuntu 16.04에서 Python 3.6 사용하기 (2) 2018.02.12 CentOS 6에서 eclipse가 죽는 문제 해결하기 (0) 2015.02.27 GLib와 GIO를 이용한 간단한 네트워크 서버와 클라이언트 예제 (0) 2013.08.13 diff 출력 형식 (0) 2013.05.31 댓글