인용 세 모드
'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 만. 함수 버그 다수가 이 거 빼먹은 거.