- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: echo
키워드: 공백문자, 스페이스, 문자열, 큰따옴표
사용처: 공백문자(스페이스)를 포함한 문자열을 한 문장으로 다루고 싶을 때
실행예제
$ ./space-str.sh
ERROR: invalid value
스크립트
#!/bin/sh
result="invalid value"
if [ "$result" = "invalid value" ]; then #--- 1
echo "ERROR: $result" 1>&2
exit 1
fi
해설
이 스크립트는 공백문자를 포함한 문자열을 if문으로 비교해서 값이 “invalid value”라는 문자열일 때 에러를 출력합니다. 공백을 포함한 문자열 취급이 핵심입니다.
셸 스크립트에서 변수 구분자는 셸 변수 IFS로 정의하는데 기본값은 공백 기호, 탭, 줄 바꿈이 지정되어 있습니다. 즉 공백문자는 변수의 구분자를 뜻하는 특별한 의미가 있습니다.
그러므로 공백문자가 포함된 문자열이 저장된 변수를 따옴표 처리하지 않으면 쪼개진것 처럼 인식하여 생각과 다른 동작을 할 수도 있습니다.
1
에서는 변수 result가 공백문자를 포함하므로 이것을 따옴표로 묶어 “$result”처럼 처리합니다. 만약 따옴표를 하지 않은 채 $result라고 작성하면 1
은 다음처럼 등호 기호의 왼쪽에 인수가 두 개 있다고 해석할 것입니다.
if [ invalid value = "invalid value" ]; then
결과적으로 아래와 같이 인수가 너무 많다는 에러가 발생합니다.
-
따옴표 처리하지 않으면 에러
$ ./space-str.sh ./space-str.sh: line 5: [: too many arguments
따라서 1
에서는 공백문자를 포함한 변수 result를 큰따옴표 기호로 둘러 싸서 “$result”라고 작성해서 공백문자를 포함한 전체를 하나의 문자열로 다룹니다.
또한 변수 result값이 비었으면 1
은 다음처럼 해석됩니다.
if [ = "invalid value" ]; then
즉, 비교 대상이 없는 상태로 등호 기호를 쓴 경우가 되어 아래 처럼 문법 에러가 발생합니다(표시되는 에러 메시지는 OS에 따라 다릅니다).
-
result가 비었을 때 실행 에러
$ ./space-str.sh ./space-str.sh: line 5: [: =: unary operator expected
셸 스크립트에서 변수에 문자열을 넣고 사용할 때는 ‘공백문자가 들어가거나 빈 문자열일지도 모른다’ 라고 늘 염두에 둬야 합니다. 이 예제처럼 공백문자를 포함하든지 안 하든지 따옴표 처리를 합시다.