본문 바로가기

IT

[Ubuntu/Linux] 쉘스크립트 인용부호의 모든 것

쉘스크립트 설명에 인용부호를 빼먹을 수는 없지요.

명령 프롬프트에 남길 수 있는 인용부호가 세 종류나 되기 때문에 꼭 짚고 넘어가야 합니다.

작은 따옴표, 큰 따옴표, 역 따옴표.

위의 따옴표 삼형제는 쓰임이 모두 다릅니다.

각각의 인용부호에 대한 정의를 분명하게 확인하지 않으면 낭패볼 일이 있을지도 모릅니다.



화면에 스트링을 출력하기 위해서는 echo 명령어를 이용합니다.

$ echo string
string
$ echo "string"
string

echo에 큰 따옴표를 하든 하지않든 모두 string을 출력해줍니다.


하지만 큰 따옴표를 출력하려면 어떻게 해야할까요?

위의 두 번째 예에서 큰 따옴표가 출력되지 않은 것은 확인했습니다.

큰 따옴표를 출력하기 위해서는 아래 세 가지 중 하나를 택하면 됩니다.

$ echo "\""
"
$ echo \"
"
$ echo '"'
"

역슬래시를 사용하여 큰 따옴표를 출력하거나,

작은 따옴표로 큰 따옴표를 감싸서 출력할 수도 있네요.


그러면 바로 위의 예에서 쓰인 백슬러시는 어떻게 출력해야하는 것일까요?

백슬러시도 위와 유사한 방법으로 출력하면 됩니다.

$ echo "\\"
\
$ echo \\
\
$ echo '\'
\


위의 예에서 알 수 있는 사실이 있습니다.

작은 따옴표로 감싸진 문자열은 변화없이 그대로 출력됩니다.

설사 큰 따옴표 자신이나 백슬래시라 할지라도 문자변환 없이 작은 따옴표 안에 있는 모습 그대로입니다.


이제 작은 따옴표를 출력해보겠습니다.

작은 따옴표는 아래 두 가지 방식으로 출력할 수 있습니다.

$ echo \'     # echo \"와 유사
'
$ echo "'" # echo '"'와 유사하고 echo "\""와도 유사
'

먼저 언급한 큰 따옴표의 출력과 유사하지만 하나 다른 점이 있습니다.

바로 큰 따옴표와 역슬래시 조합이 없네요.

위의 조합으로 출력하면 아래와 같은 결과가 나옵니다.

$ echo "\'"
\'

분명 echo "'"와 "\'" 둘 중 하나를 선택해서 '를 출력하게 결정해야 했겠지요.

그 중에 가장 경제적인 선택을 했을겁니다.

그래서 "'"가 '를 나타내는 것으로 확정했으리라 추정하고 있습니다.


하지만, 제 소견으로 생각하건데,

어쩌면 논리적으로는 "\'"를 선택했어야하지 않았을까란 생각도 듭니다..


작은 따옴표는 작은 따옴표 안에 있는 것을 가급적 그대로 출력합니다.

변수를 작은 따옴표 내에서 출력하면 변수명 그대로 출력이 됩니다.

$ echo '$HOME'
$HOME


이에 반해 변수를 큰 따옴표 안에 넣으면 변수가 실제 값으로 치환된 후 출력됩니다.

$ echo "$HOME"
/home/storycompiler


역 따옴표는 따옴표 안에 있는 명령문의 실행하여 실행결과를 대입합니다.

$ echo The working directory is `pwd`
The working directory is /home/storycompiler
$ echo "The working directory is `pwd`"
The working directory is /home/storycompiler

위처럼 `pwd`의 결과값이 나옵니다.


하지만, 아래의 경우에서는 역따옴표가 제대로 동작하지 않아 의도한 값이 출력되지 않습니다.

$ echo 'The working directory is `pwd`'
The working directory is `pwd`
$ echo 'The working directory is \`pwd\`'
The working directory is \`pwd\`
$ echo "The working directory is \`pwd\`"
The working directory is `pwd`

역따옴표는 역따옴표 자체를 사용해야 의미가 있습니다.

백슬래시로 역따옴표를 막는다면 제대로 동작하지 않겠죠.


간단하게 인용부호를 살펴봤습니다.

그럼 좋은 하루 보내세요~

끝_


* References

http://www.grymoire.com/Unix/Sh.html#uh-6