Quotes
다른 프로그래밍 언어와 달리 숫자나 스트링 값을 구분하기 위한 용도로 사용하지 않는다.
quotes의 용도는 아래와 같다.
- 공백으로 분리되는 여러 개의 스트링을 하나의 인수로 만들 때
- 라인 개행이나 둘 이상의 공백을 유지할 때
- 단어 분리, globbing 발생을 방지하기 위해
- 키워드, 메타 문자, 특수 기능을 하는 문자나 단어를 단순 문자열로 만들기 위해
- 문자열을 강조하기 위해
특수 기능을 하는 문자
shell 메타 문자
문자 | 기능 |
$ | 매개변수 확장, 산술 확장, 명령 치환 |
` | 명령 확장 |
! | history 확장 |
shell 메타 문자를 포함하는 문자열을 사용할 때 의도치 않은 동작을 수행할 수 있기 때문에 \ 또는 quotes를 이용해 특수 기능을 제거해야 한다.
No quotes
따옴표 또는 쌍따옴표로 감싸지 않은 문자열은 기본적으로 escape할 수 있다.
명령행 상에서 공백은 인수를 구분하는 데 사용되며, 둘 이상의 공백은 무의미하므로 하나의 공백으로 취급된다. 공백 또한 \으로 escape 할 수 있다.
echo 명령어에 \와 조합되는 escape 문자를 인식시킬 때에는 -e 옵션을 사용하며, escape 문자 앞에 \를 하나 더 붙여야 한다.
행의 마지막에 \을 붙이고 개행을 하면 \newline과 같이 처리되며, 이것을 backslash-newline이라고 한다. \ 뒤에는 문자가 오면 안 된다.
echo -e foo \
> bar \
> 12
escape은 대입 연산에서도 처리된다.
Double quotes ""
쌍따옴표로 감싸진 문자열은 문자열에 포함된 특수기능을 하는 문자들이 해석되고 실행되며, 공백과 개행이 유지된다. 이는 변수를 사용할 때에도 동일하다.
AA="this is
two lines"
echo $AA
echo "$AA"
큰따옴표로 감싸진 문자열에서는 ", $, `, \, newline을 escape 할 수 있다.
Array와 관련된 특수 기능
"${arr[@]}", "${arr[*]}"의 의미가 각각 다르므로 사용 시 주의가 필요하다. ${arr[@]}, ${arr[*]} 자체는 배열의 전체 원소를 나타낸다.
"${arr[@]}"
== "${arr[0]}" "${arr[1]}" "${arr[2]}" ...
"${arr[*]}"
== "${arr[0]}X${arr[1]}X${arr[2]}X..."
변숫값이 Null인 경우
변숫값이 Null인 경우에는, quote를 하지 않으면 인수에 포함되지 않는다.
AA=""
echo yy $AA zz
echo yy "$AA" zz
변수를 quote 하면 오류 메시지가 좀 더 명확하게 출력되므로 특정한 경우가 아니라면 quote 해서 사용하는 것이 좋다.
참고 문서
https://mug896.github.io/bash-shell/quotes.html