공든탑앱 열기

따옴표와 확장

리눅스마스터 2급 · Shell · 약 9분

쉽게 말하면

셸은 명령을 실행하기 전에 *(아무 글자), $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).

시험에 이렇게 나와요

확인 문제

Q1. NAME=kim일 때 echo '$NAME'과 echo "$NAME"의 결과는?

  1. 둘 다 kim
  2. 둘 다 $NAME
  3. $NAME / kim
  4. kim / $NAME
정답 보기

3번 $NAME / kim

작은따옴표 안은 모든 문자를 글자 그대로 둔다(변수도 해석 안 함). 큰따옴표 안에서는 $, `, \가 살아 있어 변수가 바뀐다.

Q2. 명령 치환에 해당하지 않는 것은?

  1. 'date'
  2. "$(date)"
  3. $(date)
  4. `date`
정답 보기

1번 'date'

'date'다. 작은따옴표 안은 모두 글자 그대로라 명령이 실행되지 않는다. 백틱과 $( )는 명령 치환이고, 큰따옴표 안에서도 $( )는 실행된다.

Q3. file1, file2, … file9 중 한 글자 숫자 파일만 지정하는 패턴은?

  1. file?
  2. file{1..9}*
  3. file[1-9]
  4. file*
정답 보기

3번 file[1-9]

[1-9]는 1~9 중 한 글자. file?는 숫자가 아닌 글자도 포함.

Q4. echo {a,b}{1,2}의 결과는?

  1. a b 1 2
  2. {a,b}{1,2}
  3. a1 a2 b1 b2
  4. a1 b2
정답 보기

3번 a1 a2 b1 b2

a1 a2 b1 b2다. 중괄호 확장은 앞뒤 목록의 모든 조합을 만든다.

헷갈리기 쉬운 O·X

큰따옴표 안에서는 $변수가 해석되지 않는다.

정답 보기

X 큰따옴표 안에서도 $는 해석된다. 막는 건 작은따옴표.

와일드카드 ?는 0개 이상의 문자를 뜻한다.

정답 보기

X ?는 정확히 1개. 0개 이상은 *.

$(명령)과 `명령`은 둘 다 명령 치환이다.

정답 보기

O 맞는 설명이다.

함께 보면 좋은 개념