따옴표와 확장
쉽게 말하면
셸은 명령을 실행하기 전에 *(아무 글자), $NAME(변수 값) 같은 기호를 먼저 실제 값으로 바꿔요. 작은따옴표는 '바꾸지 말고 글자 그대로', 큰따옴표는 '변수 값만 바꿔'라는 표시예요.
시험용 정의
셸은 명령을 실행하기 전에 변수·명령 치환·와일드카드를 먼저 펼친다(확장). 따옴표와 역슬래시는 이 확장을 막거나 허용하는 스위치다.
비유로 이해하기
작은따옴표는 "글자 그대로 받아 적으세요", 큰따옴표는 "이름표($NAME)만 실제 이름으로 바꿔 적으세요"라는 지시다.
자세히
따옴표와 치환
| 표기 | 동작 | 예 (NAME=kim) |
|---|---|---|
| '…' | 모두 글자 그대로 | echo '$NAME' → $NAME |
| "…" | $, `, \ 만 해석 (공백은 하나로 묶음) | echo "hi $NAME" → hi kim |
| `명령` | 명령 치환 (옛 방식) | echo `date` → 현재 날짜 |
| $(명령) | 명령 치환 (권장, 중첩 가능) | echo $(whoami) |
| \문자 | 바로 뒤 한 글자의 특수 의미 제거 | echo \$NAME → $NAME |
| $((식)) | 산술 확장 | echo $((3+4)) → 7 |
와일드카드 (파일 이름 확장)
| 기호 | 뜻 | 예 |
|---|---|---|
| * | 0개 이상 아무 문자 | ls *.txt |
| ? | 정확히 1개 문자 | ls file?.log → file1.log |
| [abc] | 괄호 안 문자 중 하나 | ls [abc]* |
| [a-z] / [0-9] | 범위 중 하나 | ls log[0-9] |
| [!abc] 또는 [^abc] | 괄호 안 문자를 제외한 하나 | ls [!a]* |
중괄호 확장
파일 존재와 상관없이 문자열을 만든다. mkdir dir{1,2,3} → dir1 dir2 dir3, touch file{1..5}.txt → file1.txt ~ file5.txt, cp app.conf{,.bak} → cp app.conf app.conf.bak.
틸드 ~
~ 내 홈, ~kim kim의 홈, ~+ 현재 디렉터리(PWD), ~- 이전 디렉터리(OLDPWD).
시험에 이렇게 나와요
echo "$user"→ 변수 값이 나온다,echo '$user'→ 글자 그대로 $user- 명령 치환
`명령`·$(명령), 와일드카드*(여러 글자)?(한 글자)[abc]
확인 문제
Q1. NAME=kim일 때 echo '$NAME'과 echo "$NAME"의 결과는?
- 둘 다 kim
- 둘 다 $NAME
- $NAME / kim
- kim / $NAME
정답 보기
3번 $NAME / kim
작은따옴표 안은 모든 문자를 글자 그대로 둔다(변수도 해석 안 함). 큰따옴표 안에서는 $, `, \가 살아 있어 변수가 바뀐다.
Q2. 명령 치환에 해당하지 않는 것은?
- 'date'
- "$(date)"
- $(date)
- `date`
정답 보기
1번 'date'
'date'다. 작은따옴표 안은 모두 글자 그대로라 명령이 실행되지 않는다. 백틱과 $( )는 명령 치환이고, 큰따옴표 안에서도 $( )는 실행된다.
Q3. file1, file2, … file9 중 한 글자 숫자 파일만 지정하는 패턴은?
- file?
- file{1..9}*
- file[1-9]
- file*
정답 보기
3번 file[1-9]
[1-9]는 1~9 중 한 글자. file?는 숫자가 아닌 글자도 포함.
Q4. echo {a,b}{1,2}의 결과는?
- a b 1 2
- {a,b}{1,2}
- a1 a2 b1 b2
- a1 b2
정답 보기
3번 a1 a2 b1 b2
a1 a2 b1 b2다. 중괄호 확장은 앞뒤 목록의 모든 조합을 만든다.
헷갈리기 쉬운 O·X
큰따옴표 안에서는 $변수가 해석되지 않는다.
정답 보기
X 큰따옴표 안에서도 $는 해석된다. 막는 건 작은따옴표.
와일드카드 ?는 0개 이상의 문자를 뜻한다.
정답 보기
X ?는 정확히 1개. 0개 이상은 *.
$(명령)과 `명령`은 둘 다 명령 치환이다.
정답 보기
O 맞는 설명이다.