변환 처리_12 히어 도큐먼트에서 변수 확장하지 않고 그대로 $str처럼 표시하기

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

명령어: cat
키워드: 히어 도큐먼트, 따옴표, 파라미터 확장, 명령어 치환, 텍스트
사용처: 히어 도큐먼트 본체에 `(그레이브)를 $로 사용하는데 확장하지 않고 그대로 출력하고 싶을 때


실행예제

$ ./here.sh
여기는 히어 도큐먼트 본체입니다.
이 부분에 적힌 문자열은 명령어 표준 출력에
직접 리다이렉트됩니다.

종료 문자열을 작은따옴표 기호로 감싸면
$str이라고 적어도 변수 확장되지 않으며
`echo abc`도 명령어 치환되지 않습니다.

스크립트

#!/bin/sh

# 이 변수는 확장되지 않으므로 실제로는 사용되지 않음
str="Dummy"

cat << 'EOT'  #--------- 1
여기는 히어 도큐먼트 본체입니다.
이 부분에 적힌 문자열은 명령어 표준 출력에
직접 리다이렉트됩니다.

종료 문자열을 작은따옴표 기호로 감싸면
$str이라고 적어도 변수 확장되지 않으며
`echo abc`도 명령어 치환되지 않습니다.
EOT

   

해설

이 스크립트는 히어 도큐먼트를 사용할 때 파라미터 확장이나 명령어 치환을 하지 않습니다. 히어 도큐먼트란 셸 스크립트 본체에 포함된 텍스트를 스크립트 내부 명령어 표준 입력으로 사용하는 기능입니다. ‘여기에 도큐먼트가 있어요’라는 의미로 Here Documents라고 부릅니다.

히어 도큐먼트를 사용하는 일반적인 방법은 다음과 같습니다.

  • 히어도큐먼트 사용법

    (명령어) << (종료 문자열)
    히어 도큐먼트 본체
    ...
    종료 문자열
    

종료 문자열은 히어 도큐먼트 본체에 나오지 않는 문자열이면 뭐든지 상관없습니다. 관용적으로 END, EOT, EOF가 자주 사용되는데 실수로 히어 도큐먼트 본체에 이런 문자열이 나오면 에러나 일어나므로 __EOT__ 같은 기호를 붙이거나 EndOfMultilineText 같이 긴 종료 문자열을 지정하는 사람도 있습니다. 여기에서는 End of Text라는 의미로 EOT를 사용합니다.

한편, 히어 도큐먼트에서는 파라미터 확장과 명령어 치환이 일어납니다. 즉, $ 기호와 ` 기호는 특별한 의미가 있어서 변수 $str은 변수값으로 확장됩니다.

한편, 파라미터 확장이나 명령어 치환을 하지 않고 적힌 내용 그대로 출력하고 싶다면 예제 스크립트처럼 작성합니다. 히어 도큐먼트 종료 문자열을 1처럼 작은따옴표로 감사서 ‘EOT’ 라고 작성하면 히어 도큐먼트 본체의 파라미터 확장이나 명령어 치환을 막아서 $ 기호나 `기호를 포함한 텍스트를 그대로 취급할 수 있습니다.

   

파라미터 확장 제어

히어 도큐먼트 안에 파라미터를 확장하고 싶은 변수와 그렇지 않은 변수가 섞여 있을 수도 있습니다. 그럴 때는 따로 변수를 이스케이프해서 대응합니다.

  • 파일1 이스케이프하면 파라미터 확장을 제어 가능

    #!/bin/sh
    
    string="Hello"
    cat << EOT
    이 변수는 확장됩니다.  $string
    이 변수는 확장되지 않습니다. \$string
    EOT
    

    첫 번째 셸 변수 $string은 이스케이프하지 않았으므로 확장됩니다. 두 번째는 $string 으로 $ 기호를 이스케이프하므로 $string 이라는 문자열을 의미합니다.

  • 파라미터 확장을 제어하는 예

    이 변수는 확장됩니다. Hello
    이 변수는 확장되지 않습니다. $string
    

   

히어 스트링

bash에는 히어 도큐먼트(«)와 닮은 히어 스트링(«<)이 있습니다. 더 간결하게 포함된 텍스트를 셸 스크립트에 작성할 수 있습니다.

  • 파일2 히어 스트링 예제

    #!/bin/bash
    
    string="Hello"
    
    # 포함된 문자열은 큰따옴표로 감싸면 됨
    cat <<< "인사 예제:
    안녕하세요.
    $string
    니하오"
    

히어 도큐먼트에서는 EOT 같은 종료 문자열을 사용했지만, 히어 스트링은 단순히 큰따옴표로 포함하고 싶은 문자열을 둘러싸면 되므로 더 직관적이고 알기 쉽습니다.

포함된 문자열 안에 $ 기호를 확장하고 싶지 않다면 히어 도큐먼트와 마찬가지로 큰따옴표가 아닌 작은따옴표를 쓰면 됩니다.