1. 사용 명령어 |
(1) cat
2. 키워드 & 사용처 |
(1) 키워드
히어 도큐먼트, 따옴표, 파라미터 확장, 명령어 치환, 텍스트
(2) 사용처
히어 도큐먼트 본체에 `(그레이브)를 $로 사용하는데 확장하지 않고 그대로 출력하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./here.sh
여기는 히어 도큐먼트 본체입니다.
이 부분에 적힌 문자열은 명령어 표준 출력에
직접 리다이렉트됩니다.
종료 문자열을 작은따옴표 기호로 감싸면
$str이라고 적어도 변수 확장되지 않으며
`echo abc`도 명령어 치환되지 않습니다.
4. 스크립트 |
#!/bin/sh
# 이 변수는 확장되지 않으므로 실제로는 사용되지 않음
str="Dummy"
cat << 'EOT' ①
여기는 히어 도큐먼트 본체입니다.
이 부분에 적힌 문자열은 명령어 표준 출력에
직접 리다이렉트됩니다.
종료 문자열을 작은따옴표 기호로 감싸면
$str이라고 적어도 변수 확장되지 않으며
`echo abc`도 명령어 치환되지 않습니다.
EOT
5. 해설 |
이 스크립트는 히어 도큐먼트를 사용할 때 파라미터 확장이나 명령어 치환을 하지 않습니다. 히어 도큐먼트란 셸 스크립트 본체에 포함된 텍스트를 스크립트 내부 명령어 표준 입력으로 사용하는 기능입니다. '여기에 도큐먼트가 있어요'라는 의미로 Here Documents라고 부릅니다.
히어 도큐먼트를 사용하는 일반적인 방법은 다음과 같습니다.
(명령어) << (종료 문자열)
히어 도큐먼트 본체
...
종료 문자열
종료 문자열은 히어 도큐먼트 본체에 나오지 않는 문자열이면 뭐든지 상관없습니다. 관용적으로 END, EOT, EOF가 자주 사용되는데 실수로 히어 도큐먼트 본체에 이런 문자열이 나오면 에러나 일어나므로 __EOT___ 같은 기호를 붙이거나 EndOfMultilineText 같이 긴 종료 문자열을 지정하는 사람도 있습니다. 여기에서는 End of Text라는 의미로 EOT를 사용합니다.
히어 도큐먼트에서는 파라미터 확장과 명령어 치환이 일어납니다. 즉 $ 기호와 `기호는 특별한 의미가 있어서 변수 $str은 변수값으로 확장됩니다.
파라미터 확장이나 명령어 치환을 하지 않고 적힌 내용 그대로 출력하고 싶다면 예제 스크립트처럼 작성합니다. 히어 도큐먼트 종료 문자열을 ①처럼 작은따옴표로 감사서 'EOT' 라고 작성하면 히어 도큐먼트 본체의 파라미터 확장이나 명령어 치환을 막아서 $ 기호나 `기호를 포함한 텍스트를 그대로 취급할 수 있습니다.
6. 파라미터 확장 제어 |
히어 도큐먼트 안에 파라미터를 확장하고 싶은 변수와 그렇지 않은 변수가 섞여 있을 수도 있습니다. 그럴 때는 따로 변수를 이스케이프해서 대응합니다.
#!/bin/sh
string="Hello"
cat << EOT
이 변수는 확장됩니다. $string
이 변수는 확장되지 않습니다. \$string
EOT
첫 번째 셸 변수 $string은 이스케이프하지 않았으므로 확장됩니다. 두 번째는 \$string 으로 $ 기호를 이스케이프하므로 $string 이라는 문자열을 의미합니다.
이 변수는 확장됩니다. Hello
이 변수는 확장되지 않습니다. $string
7. 히어 스트링 |
bash에는 히어 도큐먼트(<<)와 닮은 히어 스트링(<<<)이 있습니다.
더 간결하게 포함된 텍스트를 셸 스크립트에 작성할 수 있습니다.
#!/bin/bash
string="Hello"
# 포함된 문자열은 큰따옴표로 감싸면 됩니다.
cat <<< "인사 예제:
안녕하세요.
$string
니하오"
히어 도큐먼트에서는 EOT 같은 종료 문자열을 사용했지만, 히어 스트링은 단순히 큰따옴표로 포함하고 싶은 문자열을 둘러싸면 되므로 더 직관적이고 알기 쉽습니다.
포함된 문자열 안에 $ 기호를 확장하고 싶지 않다면 히어 도큐먼트와 마찬가지로 큰따옴표가 아닌 작은따옴표를 쓰면 됩니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 파일처리 - 024 명령어 사용법을 표시할 때 현재 파일명 표시하기 (0) | 2021.03.16 |
---|---|
[Linux 셸 스크립트] 파일처리 - 023 절대 경로, 상대 경로 관계없이 같은 동작하기 (0) | 2021.03.11 |
[Linux 셸 스크립트] 변환처리 - 021 미정의 변수를 에러로 처리해서 실수 방지하기 (0) | 2021.03.11 |
[Linux 셸 스크립트] 변환처리 - 020 명령어 출력 결과를 파일명에 포함해서 그 파일명을 대상으로 명령어를 실행할 때 보기 쉽게 하기 (0) | 2021.03.05 |
[Linux 셸 스크립트] 변환처리 - 019 언더스코어 등을 포함한 문자열에서 변수를 명확하게 구분하기 (0) | 2021.03.05 |
댓글