C.W.K.
Stream
Lesson 11 of 12 · published

Heredoc 과 스크립트 인자

~10 min · heredoc, args, getopts

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

Heredoc — embedded 다중 줄 문자열

cat <<EOF
Hello, $USER
Today is $(date +%Y-%m-%d)
EOF

여는 토큰 (여기 EOF) 과 닫는 토큰 사이가 command 의 stdin. default 로 변수 + command substitution 펼침.

확장 비활성 — 구분자 인용

cat <<'EOF'
$USER stays literal
$(date) stays literal
EOF

여는 구분자의 어떤 글자든 인용 (보통 전체 'EOF') 하면 변수 확장 OFF. 펼치면 안 되는 shell 풍 문법이 든 embedded config / 스크립트 / 템플릿에 사용.

앞 탭 제거 — <<-

cat <<-EOF
	hello
	world
	EOF

<<- 가 각 줄의 앞 탭 (공백 아님) 제거 — heredoc 을 if 블록 안에 들여쓸 때 유용.

스크립트 인자

  • $0 — 스크립트 이름.
  • $1 $2 ... — positional.
  • $# — 인자 개수.
  • $@ — 전부. 항상 인용: "$@".
  • $* — IFS 로 합친 — 보통 잘못.
  • shift — $1 drop, 재번호.

getopts 로 flag 파싱

verbose=0
while getopts ':vo:' opt; do
  case "$opt" in
    v) verbose=1 ;;
    o) output="$OPTARG" ;;
    \?) echo "bad flag: -$OPTARG" >&2; exit 2 ;;
  esac
done
shift $((OPTIND - 1))

POSIX getopts 는 short flag 만. long flag 는 손으로 파싱 / bash getopt 변종 / Python argparse 로 갈아타기. 대부분 스크립트는 short-only 로 충분.

Code

Heredoc + getopts 한 스크립트에·bash
#!/usr/bin/env bash
set -euo pipefail
name=World
while getopts ':n:' opt; do
  case "$opt" in
    n) name=$OPTARG ;;
    *) echo "usage: $0 [-n NAME]" >&2; exit 2 ;;
  esac
done
cat <<EOF
Hello, $name!
from $0
EOF

External links

Exercise

greet.sh 작성 — -n NAME (default World) 받고 heredoc 으로 두 줄 인사. ./greet.sh, ./greet.sh -n Pippa, ./greet.sh -x (에러 나야 함) 테스트.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.