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