- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: 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 같은 종료 문자열을 사용했지만, 히어 스트링은 단순히 큰따옴표로 포함하고 싶은 문자열을 둘러싸면 되므로 더 직관적이고 알기 쉽습니다.
포함된 문자열 안에 $ 기호를 확장하고 싶지 않다면 히어 도큐먼트와 마찬가지로 큰따옴표가 아닌 작은따옴표를 쓰면 됩니다.