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

변수와 인용

~13 min · variables, quoting, expansion

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

인용 세 모드

  • 'single' — 완전 literal. 확장 / escape 없음.
  • "double" — 변수 + command substitution 확장. 개별 글자 (\$, \") escape 가능.
  • 인용 없음 — word-split + glob 확장. 거의 원하는 게 아님.

90% 룰 — 변수는 항상 인용

name="Pippa Choi"
echo $name           # Pippa Choi  (보기엔 OK 지만 인자 두 개 전달됨)
echo "$name"         # Pippa Choi  (인자 하나)
for f in $files; do  # $files 값을 word-split
for f in "$files"; do # 무조건 한 번 iteration

인용 안 하면 인자 더 전달, edge case (공백 파일명, 빈 값) 가 조용히 깨짐. 일부러 word splitting 원하는 거 아니면 항상 "$var".

Default 값

: "${PORT:=8000}"     # unset 이면 설정
echo "${USER:-anon}"   # unset 이면 'anon'. USER 자체는 안 바뀜
: "${REQUIRED:?must be set}"  # unset 이면 에러 + 종료

앞의 : 는 no-op command — 확장의 side effect 만 원할 때. Parameter expansion 풀 표는 epilogue 트랙에서.

사용자 입력 받기

read -rp 'Name: ' name
echo "hi $name"
# -r 이 backslash 보존. 항상 사용
# -s 는 silent (비밀번호)

local vs global

함수 안에서 local var=value 가 함수 private. local 없으면 외부 scope 로 leak. POSIX sh 에는 local 없음 — bash/zsh 만. 함수 버그 다수가 이 거 빼먹은 거.

Code

무조건 인용·bash
#!/usr/bin/env bash
set -euo pipefail
files=("a file.txt" "b.txt")
for f in "${files[@]}"; do
  ls -l -- "$f"
done

External links

Exercise

with space.txt 파일 생성. f='with space.txt'; cat $f 실행 후 실패 확인. cat "$f" 로 작동 확인. ShellCheck 설치하고 홈의 아무 스크립트에 돌려보기.

Progress

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

댓글 0

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

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