Escape Sequences

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

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

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

Escape Sequence Character represented 적용
\\ backslash *
\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) $' '

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

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
.............................................................

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

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