Linux/Shell Script

[Shell Script] Quotes - 1

비번변경 2022. 6. 4. 17:54

Quotes

다른 프로그래밍 언어와 달리 숫자나 스트링 값을 구분하기 위한 용도로 사용하지 않는다.

quotes의 용도는 아래와 같다.

  • 공백으로 분리되는 여러 개의 스트링을 하나의 인수로 만들 때
  • 라인 개행이나 둘 이상의 공백을 유지할 때
  • 단어 분리, globbing 발생을 방지하기 위해
  • 키워드, 메타 문자, 특수 기능을 하는 문자나 단어를 단순 문자열로 만들기 위해
  • 문자열을 강조하기 위해

 

 

특수 기능을 하는 문자

shell 메타 문자

문자 기능
$ 매개변수 확장, 산술 확장, 명령 치환
` 명령 확장
history 확장

shell 메타 문자를 포함하는 문자열을 사용할 때 의도치 않은 동작을 수행할 수 있기 때문에 \ 또는 quotes를 이용해 특수 기능을 제거해야 한다.

 

No quotes

따옴표 또는 쌍따옴표로 감싸지 않은 문자열은 기본적으로 escape할 수 있다.

escape

명령행 상에서 공백은 인수를 구분하는 데 사용되며, 둘 이상의 공백은 무의미하므로 하나의 공백으로 취급된다. 공백 또한 \으로 escape 할 수 있다.

whitespace

echo 명령어에 \와 조합되는 escape 문자를 인식시킬 때에는 -e 옵션을 사용하며, escape 문자 앞에 \를 하나 더 붙여야 한다.

echo -e

행의 마지막에 \을 붙이고 개행을 하면 \newline과 같이 처리되며, 이것을 backslash-newline이라고 한다. \ 뒤에는 문자가 오면 안 된다.

echo -e foo \
> bar \
> 12

backslash-newline

escape은 대입 연산에서도 처리된다.

 

Double quotes ""

쌍따옴표로 감싸진 문자열은 문자열에 포함된 특수기능을 하는 문자들이 해석되고 실행되며, 공백과 개행이 유지된다. 이는 변수를 사용할 때에도 동일하다.

AA="this          is
two          lines"
echo $AA
echo "$AA"

double quotes

큰따옴표로 감싸진 문자열에서는 ", $, `, \, newline을 escape 할 수 있다.

double quotes 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

null quotes

변수를 quote 하면 오류 메시지가 좀 더 명확하게 출력되므로 특정한 경우가 아니라면 quote 해서 사용하는 것이 좋다. 

 

 

참고 문서

https://mug896.github.io/bash-shell/quotes.html