Escape Sequences

다음과 같은 경우에서 escape 문자가 처리됩니다.
모두 동일하게 처리되는 것은 아니고 조금씩 틀린부분이 있습니다.

  • echo -e " " or ' ' 에서
  • $' '
  • printf " " or ' ' 에서
  • printf %b 에서

sh 에서는 echo 명령을 사용할때 기본적으로 " " , ' ' 에서 모두 escape 문자가 처리 됩니다.
따로 명령에 -e 옵션이 없습니다.

Escape Sequence Character represented 적용
\\ \ 문자 *
\a alert (bell) *
\b backspace *
\e escape (ASCII 033) *
\f form feed *
\n newline *
\r carriage return *
\t horizontal tab *
\v vertical tab *
\' single quotes printf
$' '
\" double quotes *
\? question mark printf
$' '
\<NNN> 8 비트 문자로 N 은 8 진수 값입니다. ( 1 ~ 3 개 ) printf
$' '
\0<NNN> 8 비트 문자로 N 은 8 진수 값입니다. ( 1 ~ 3 개 ) echo
\x<HH> 8 비트 문자로 H 은 16 진수 값입니다. ( 1 ~ 2 개 ) *
\u<HHHH> 유니코드 문자 입니다. H 는 16 진수 값입니다. ( 1 ~ 4 개 ) *
\U<HHHHHHHH> 유니코드 문자 입니다. H 는 16 진수 값입니다. ( 1 ~ 8 개 ) *
\c 이후의 스트링은 출력에서 제외됩니다. echo
\cx Ctrl-x 문자, 가령 $'\cz' 는 Ctrl-z (^Z) $' '

적용의 * 문자는 모두를 뜻합니다.

Quotes 에 따른 escape 문자 처리 비교

echo 명령에서 -e 옵션 사용에 따른 escape 문자 처리를 해석할 때는 먼저 -e 옵션을 제거한 후에 명령을 실행해 보고 출력 결과에 대해서 escape sequence 를 적용하면 됩니다.

No Quotes

# < -e 옵션 제거 >                          < -e 옵션 추가 >

$ echo 111\t222\t333                      $ echo -e 111\t222\t333
111t222t333                               111t222t333

$ echo 111\\t222\\t333                    $ echo -e 111\\t222\\t333
111\t222\t333                             111     222     333

$ echo 111\\\t222\\\t333                  $ echo -e 111\\\t222\\\t333
111\t222\t333                             111     222     333

$ echo 111\\\\t222\\\\t333                $ echo -e 111\\\\t222\\\\t333
111\\t222\\t333                           111\t222\t333

Double Quotes

$ echo "111\t222\t333"                    $ echo -e "111\t222\t333"       
111\t222\t333                             111     222     333

$ echo "111\\t222\\t333"                  $ echo -e "111\\t222\\t333"
111\t222\t333                             111     222     333

$ echo "111\\\t222\\\t333"                $ echo -e "111\\\t222\\\t333"
111\\t222\\t333                           111\t222\t333

$ echo "111\\\\t222\\\\t333"              $ echo -e "111\\\\t222\\\\t333"
111\\t222\\t333                           111\t222\t333

$ echo "111\\\\\t222\\\\\t333"            $ echo -e "111\\\\\t222\\\\\t333"
111\\\t222\\\t333                         111\    222\    333

Single Quotes

$ echo '111\t222\t333'                    $ echo -e '111\t222\t333'       
111\t222\t333                             111     222     333

$ echo '111\\t222\\t333'                  $ echo -e '111\\t222\\t333'
111\\t222\\t333                           111\t222\t333

$ echo '111\\\t222\\\t333'                $ echo -e '111\\\t222\\\t333'
111\\\t222\\\t333                         111\    222\    333

$ echo '111\\\\t222\\\\t333'              $ echo -e '111\\\\t222\\\\t333'
111\\\\t222\\\\t333                       111\\t222\\t333

sh 과 bash 에서의 8 진수 16진수 처리

  • 먼저 sh 에서는 echo, printf 문에서 16 진수 형식을 사용할 수 없습니다.
  • bash 의 경우 echo, printf, $' ' 에서 조금씩 차이가 있습니다.

그러므로 sh 과 bash 에서 공통적으로 사용하려면 8 진수 형식을 사용해야 합니다.

################# sh 은 8 진수 형식만 사용가능 #################

sh$ echo '\101\102\103'
ABC
sh$ echo '\0101\0102\0103'
ABC
sh$ echo '\x41\x42\x43'             # \x<HH> 16 진수 안됨
\x41\x42\x43
.............................................................

sh$ printf '\101\102\103\n'
ABC
sh$ printf '\0101\0102\0103\n'      # \0<NNN> 8 진수 안됨
3
sh$ printf '\x41\x42\x43\n'         # \x<HH> 16 진수 안됨
\x41\x42\x43
.............................................................

sh$ printf '%b' '\101\102\103\n'
ABC
sh$ printf '%b' '\0101\0102\0103\n'
ABC
sh$ printf '%b' '\x41\x42\x43\n'    # \x<HH> 16 진수 안됨
\x41\x42\x43

###################### bash 의 경우 #########################

bash$ echo -e '\101\102\103'       # \<NNN> 8 진수 안됨
\101\102\103
bash$ echo -e '\0101\0102\0103'
ABC
bash$ echo -e '\x41\x42\x43'
ABC
.............................................................

# $' ' quotes 의 경우
bash$ echo $'\101\102\103'   
ABC
bash$ echo $'\0101\0102\0103'      # \0<NNN> 8 진수 안됨
3
bash$ echo $'\x41\x42\x43'   
ABC
.............................................................

bash$ printf '\101\102\103\n'
ABC
bash$ printf '\0101\0102\0103\n'   # \0<NNN> 8 진수 안됨
3
bash$ printf '\x41\x42\x43\n'
ABC
.............................................................

bash$ printf '%b' '\101\102\103\n'
ABC
bash$ printf '%b' '\0101\0102\0103\n'
ABC
bash$ printf '%b' '\x41\x42\x43\n'
ABC

Quiz

10 진수 값 102 111 111 으로 표현되는 스트링은 어떤 단어일까요?

# 먼저 10 진수를 8 진수로 변환
$ printf '\%o\%o\%o' 102 111 111
\146\157\157

$ printf $(printf '\%o\%o\%o' 102 111 111)
foo

2.

sh 에서의 echo 명령과, bash 에서의 echo 명령을 구분하려면?

if   [ "$(echo "x\c")" = "x" ];    then ECHO="echo"      # sh
elif [ "$(echo -e "x\c")" = "x" ]; then ECHO="echo -e"   # bash
fi