이스케이프 문자 처리
가끔 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