ice rabbit programming

[bash] quote(따옴표)에서 변수 사용하기 본문

Development/Scripts

[bash] quote(따옴표)에서 변수 사용하기

판교토끼 2021. 1. 19. 00:47

아마 CI/CD나 여타 자동화 등을 위해서 bash 스크립트나 파워쉘 스크립트를 많이 이용할 것이다. 본인도 실행하는 서버가 윈도우냐 리눅스냐에 따라서 파워쉘과 bash를 번갈아서 사용하는데, 이번 포스팅에서는 bash quote(따옴표) 내에서 변수를 사용하는 것에 대해 포스팅하고자 한다.

bash shell에서 quote는 꽤나 중요한 개념인데, 우선 따옴표는 숫자/문자의 구분을 위한 용도가 아니다. 12345, '12345', "12345"는 모두 같은 스트링 문자열이다.

공백으로 나누어진 문자를 합치거나, 공백을 유지하거나, 특수 문자 등을 스트링으로 사용하고 싶을 때와 같은 경우에 사용하는데, '문자'로서 좀더 명확히 묶는다고 생각하면 좋을 것 같다.

참고로 따옴표로 묶었을 경우에 shell에서 실행될 때에는 따옴표가 제거된 채로 실행된다.

echo "ID : ${MY_ID}"

 

double quote(쌍따옴표) 내에서는 위와 같이 ${}를 이용하면, shell 실행 시 MY_ID 변수를 찾아서 넣어준다. 이것이 따옴표에서 보편적으로 사용하는 방법이다.

하지만 single quote(홑따옴표)에서는 이렇게 동작하지 않았다. 오늘 이 포스팅을 하게 된 이유이기도 한데, 예를 들어 curl로 POST 통신을 보낼 때 JSON data는 홑따옴표로 감싸 주어야 하는데, '"${MY_ID}"'와 같이 보내주면 문자 그대로 전송되어 제대로 파라미터를 보내지 못하는 이슈가 발생하였다.

escape 문자와 함께 쌍따옴표로 감싸주고, 이를 '" "'로 감싸주면 해결할 수 있었다. 예시를 들면 다음과 같다.

curl -s -X POST -H "Content-Type: application/json; charset=utf-8" \
-d '{ "data" : [ { "temp" : { "item1" : '"\"${ITEM_1}\""', "item2" : '"\"${ITEM2}\""' } }]}' \
http://localhost:5000/api/temp

 

이 포스팅에서 curl을 다루지는 않았지만 간략히 설명하면 해당 주소로 HTTP Request를 보내는 명령이고, -H로 헤더 파일의 설정을, -d로 body의 데이터를 전송한다.