쉘기능을 자유자재로 다루기_01 함수나 if문 같은 히어 도큐먼트를 쓸 때 탭 정렬로 보기 좋게 만들기

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

명령어: cat
키워드: 히어 도큐먼트, 들여쓰기, 인텐트, 탭
사용처: 함수 블록이나 if문 등 들여쓰기가 필요한 곳에 히어 도큐먼트도 들여쓰고 싶을 때


실행예제

$ ./here-indent.sh "My Title"
# 히어 도큐먼트 자체는 앞머리에 탭이 있지만 출력에는 탭이 없음
<html>
<head>
  <title>My Title</title>
</head>
<body>
  <p>Auto HTML Sample.</p>
</body>
</html>

스크립트

#!/bin/sh

# 명령행 인수 확인
if [ -z "$1" ]; then  #------------------------------ 1
    echo "title을 인수로 지정하세요." >&2  #-------------- 1
    exit 1  #---------------------------------------- 1
else
    # 명령행 인수$1 문자열을 title 요소에 넣어서 표시
    # 히어 도큐먼트에 -(하이픈)을 지정해서
    # 앞부분 탭을 무시하고 들여쓰기
    cat <<-EOT  #------------------------------------ 2(아래전부)
    <html>
    <head>
      <title>$1</title>
    </head>

    <body>
      <p>Auto HTML sample.</p>
    </body>  #--------------------------------------- 2
    EOT
    # 히어 도큐먼트 부분에 있는 들여쓰기는 스페이스가 아니라 탭
fi

   

해설

이 스크립트는 명령행 인수로 넘어온 문자열을 요소로 HTML 파일에 출력합니다. if문에서 히어 도큐먼트를 들여쓴느 것이 특징입니다.

히어 도ㅠ먼트를 사용하면 들여쓰기를 하지 못해 불편합니다. 즉, 히어 도큐먼트 안에서 텍스트는 공백 문자를 포함해서 전부 그대로 문자열로 인식되므로 읽기 쉽도록 들여쓰면 실행했을 때 쓸모없는 탭이 들어가게 됩니다. 이것은 함수나 if문안에서 들여쓰지 않고 그대로 적어야 하기 때문에 보기 힘들어집니다.

  • 들여쓰기 없는 스크립트

    if [ -z "$1" ]; then
        echo "title 요소를 지정하세요." >&2
        exit 1
    else
        cat << EOT
    <html>
    <head>
    (생략)
    </body>
    EOT
    # 히어 도큐먼트는 들여쓰지 않음
    fi
    

하지만 히어 도큐먼트에서 «- 처럼 -(하이픈)을 사용하면 각 줄 앞에 있느느 탭을 무시할 수 있습니다.

우선 1에서 test 명령어 ‘빈 문자열이라면 참’을 뜻하는 -z 연산자를 써서 인수를 확인합니다. 참이 되면 인수 지정이 없는 것이므로 에러를 표시하고 종료합니다.

2<title> 요소를 지정한 HTML 파일을 cat 명령어로 출력합니다. 이런 if문 안에서 사용하는 히어 도큐먼트는 들여쓰기 없이 작성해야 하지만 2에서 처럼 히어 도큐먼트에서 («) 뒤에 -(하이픈)을 붙여봅시다. 이렇게 지정하면 셸은 히어 도큐먼트 부분에서 각 줄 앞에 있는 탭을 무시합니다. 결과로 예전처럼 히어 도큐먼트 본체를 탭으로 들여쓸 수 있습니다.

이렇게 히어 도큐먼트를 들여쓰면 보기 쉽고 알기 쉬워지므로 보수성도 좋아집니다. 함수안이나 if문 블록에서 히어 도큐먼트를 사용할 때는 «- 기법을 사용하기 바랍니다.

   

주의사항

  • 이 기법으로 무시되는 것은 시작 부분의 탭이라서 스페이스는 무시되지 않습니다. 따라서 이때 들여쓰기는 스페이스가 아니라 탭을 사용하기 바랍니다. vim이나 이맥스 등의 에디터는 들여쓰기를 스페이스나 탭으로 할지 및 탭 폭 설정도 지원합니다.