이스케이프 문자 처리

가끔 shell script 작성할때 echo 로 new line 을 출력해야 할 경우가 생깁니다.


Linux 에 포함된 echo 는 backslash escape (\) 를 만나도 특별하게 해석하지 않고 문자 그대로 출력하므로 \n 을 만나도 개행 문자로 처리하지 않아서 다음 문장은 \n 가 문자 그대로 출력됩니다.

$ echo "Hello\nWorld\n"


Hello\nWorld\n
CODE


echo가 탈출 문자인 \ 를 만나면 특수 문자로 처리하도록 하려면 -e 옵션을 주고 실행하면 됩니다.

$ echo -e "Hello\nWorld\n"


Hello
World

CODE


echo manual 의 해당 부분 설명은 아래와 같습니다.

$ man echo
 
If -e is in effect, the following sequences are recognized:
       \\     backslash
       \n     new line
       \r     carriage return
       \t     horizontal tab
CODE


특수문자 출력

-e 옵션을 주고 실행할 경우 \ 를 특수 문자로 처리하지만 \! 나 \? 는 특수한 의미가 아니므로 문자 그대로 출력해서 문제가 될 수 있습니다.


예로 아래와 같은 .gitignore 를 echo 로 생성하고 싶은 경우를 생각해 봅시다.


원하는 .gitignore

*
!.gitignore
CODE


-e 는 백 슬래시 escape 를 인식하나 ! 는 bash 의 특수 문자이므로 의도대로 동작하지 않고 "event not found" 에러가 발생합니다.

! 파싱 에러

$ echo -e "*\n!.gitignore"     

-bash: !.gitignore": event not found
BASH


그래서 -e 옵션을 주어 \ 를 escape 로 해서 실행하면 \! 는 특수한 의미가 있지 않으므로 의도와는 달리  \! 가 출력됩니다.

$ echo -e "*\n\!.gitignore"     

*
\!.gitignore
BASH

이럴 경우 ! 문자에 대한 octal value(\0NNN 형식) 나 hex (\xHH)값을 적어서 해결할 수 있습니다.


!의 octal(041) 값 사용

$ echo -e "*\n\041.gitignore"

*
!.gitignore
BASH

!의 hex(21) 값 사용

$ echo -e "*\n\x21.gitignore"

*
!.gitignore
BASH

같이 보기

Ref