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