- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: 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
해설
이 스크립트는 명령행 인수로 넘어온 문자열을
히어 도ㅠ먼트를 사용하면 들여쓰기를 하지 못해 불편합니다. 즉, 히어 도큐먼트 안에서 텍스트는 공백 문자를 포함해서 전부 그대로 문자열로 인식되므로 읽기 쉽도록 들여쓰면 실행했을 때 쓸모없는 탭이 들어가게 됩니다. 이것은 함수나 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이나 이맥스 등의 에디터는 들여쓰기를 스페이스나 탭으로 할지 및 탭 폭 설정도 지원합니다.