변환 처리_07 문자 속 공백문자를 포함한 문자열 변수를 인수로 쓰기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: 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​
    

셸 스크립트에서 변수에 문자열을 넣고 사용할 때는 ‘공백문자가 들어가거나 빈 문자열일지도 모른다’ 라고 늘 염두에 둬야 합니다. 이 예제처럼 공백문자를 포함하든지 안 하든지 따옴표 처리를 합시다.