Skip to content

6. 쿼우팅(Quoting)


쿼우팅이란 문자열을 따옴표로 묶는 것을 말한다. 이렇게 하는 이유는 문자열 안에 특수 문자가 들어가 있을 경우, 셸이나 셸 스크립트에 의해 그 특수 문자가 재해석이나 확장되는 것을 방지하기 위해서이다.


변수를 참조할 때는 보통 ""(큰 따옴표)로 묶어 주는 게 좋다. 이렇게 하면 $, `(Backtick), \(이스케이프)를 제외한 모든 특수 문자들을 보존해 준다. 변수에 쿼우트를 걸어서 $을 특수 문자로 인식하게 되면 그 변수의 값으로 바꿔 준다.


또한, 낱말 분리를 피하려면 쿼우팅을 걸어 준다. 이렇게 하면 인자에 공백문자가 들어 있어도 하나의 낱말로 인식하게 해준다.


예제) 이상한 변수를 에코하기
#!/bin/bash

var="'(]\\{}\$\""
echo $var
# '(]\{}$"
echo "$var"
# '(]\{}$"

IFS='\'
echo $var
# '(] {}$"
echo "$var"
# '(]\{}$"

exit 0


''(작은 따옴표)도 ""와 비슷하게 동작하지만 $의 특별한 의미를 꺼 버려서 변수 참조가 일어나지 않게 한다. '' 안의 모든 특수 문자들은 문자 그대로 해석된다. '' 안에서는 \도 글자 그대로 인식되기 때문에 ''로 묶인 문자열에 \를 써서 '' 자체를 넣으려고 한다면 원하는 결과가 나오지 않는다.


\(이스케이프)는 하나의 문자를 쿼우팅하는 방법이다. 어떤 문자 앞에 \가 오면 셸에게 그 문자를 문자 그대로 해석하게 해준다.


예제) 이스케이프된 문자들
#!/bin/bash

# \v\v\v\v라고 출력
echo "\v\v\v\v"

# 'echo'가 이스케이프된 문자들을 출력하게 하려면 -e 옵션을 써야 함
# 4개의 수직탭 출력
echo -e "\v\v\v\v"
# " 출력(8진수 아스키 문자 42)
echo -e "\042"

echo $'\n'
echo $'\a'
# 탭으로 둘러싸인 "(큰 따옴표)
echo $'\t \042 \t'

# 변수에 아스키 문자 할당
quote=$'\042'
echo "$quote 여기는 쿼우트된 부분이고, $quote 여기는 안 된 부분입니다."
# " 여기는 쿼우트된 부분이고, " 여기는 안 된 부분입니다.

# 변수에 아스키 문자 여러 개 쓰기
# 137은 "_"의 8진수 아스키 코드
triple_underline=$'\137\137\137'
echo "$triple_underline 밑줄 $triple_underline"
# ___ 밑줄 ___

# 101, 102, 103은 각각 8진수 A, B, C
ABC=$'\101\102\103\010'
echo $ABC
# ABC

# 033은 이스케이프의 8진수
escape=$'\033'
echo "\"escape\" echoes as $escape"
# "escape" echoes as

exit 0

References