물론 echo -e를 사용하면 \n이 새 줄로 인식되도록 할 수 있습니다. 문제는 "\test"처럼 \t로 시작하는 것을 에코하려고 할 때입니다.
내가 공연하고 싶다고 가정 해 봅시다 echo -e "test\n\\test"
. 나는 출력을 기대합니다 :
test \test
그러나 대신 출력은 다음과 같습니다.
test est
\\t
리터럴 \t가 아닌 탭 문자로 해석됩니다 . 이 문제에 대한 깨끗한 해결책이 있습니까?
답변1
echo -e "\\t"
백슬래시는 큰따옴표 안에서 특별하기 때문에 전달 \t
됩니다 . 그것은 다음과 같이 작용한다echo
bash
도망가다(참조) 연산자. 에서는 \\
자체적으로 탈출합니다.
다음을 수행할 수 있습니다.
echo -e "\\\\t"
for echo
가 전달되거나 \\t
( 그것도 작동함) 특별하지 않은 echo -e "\\\t"
작은따옴표를 사용할 수 있습니다 .\
echo -e '\t'
지금,echo
이식성이 매우 낮은 명령입니다. 에서도 bash
환경에 따라 동작이 달라질 수 있습니다. 나는 그것을 피하고 대신 사용하는 것이 좋습니다 printf
. 다음과 같이 할 수 있습니다.
printf 'test\n\\test\n'
또는 어떤 부분이 이러한 이스케이프 시퀀스 확장을 거치는지 결정할 수도 있습니다.
printf 'test\n%s\n' '\test'
또는:
printf '%b%s\n' 'test\n' '\test'
%b
echo
(some s) 와 동일한 이스케이프 시퀀스를 이해하는 echo
반면, 첫 번째 인수 printf
(형식)도 시퀀스를 이해하지만 echo
약간 다른 방식으로 이해합니다(다른 언어에서 수행되는 방식과 더 비슷함). 어찌됐든 \n
양측은 이해한다.
답변2
이것은 명령 매뉴얼을 따르지 않지만 man 자체는 요점 1을 지적합니다.
- 에코는 쉘에 따라 다릅니다(때때로 파이프 등을 피해야 하는 다른 이유가 있음).
- Stéphane의 의견은 좋은 선택입니다
printf
. echo
해결 방법echo -e "a\na\ta"
(큰따옴표, 더 많은 정보를 얻기 위해 이 코드를 확장하려면 해당 내용을 읽어보세요) 및 테스트:
`
➜ ~ echo -e a \n a \ta
a n a ta
➜ ~ echo -e "a \n a \ta"
a
a a
➜ ~ echo -e "a\na\ta"
a
a a
➜ ~ bash
T420s:~$ echo -e "a\na\ta"
a
a a
T420s:~$ echo -e a\na\ta
anata
T420s:~$ echo a\na\ta
anata
T420s:~$ echo "a\na\ta"
a\na\ta
T420s:~$
첫 번째 쉘은 ZSH입니다.
답변3
큰따옴표 안의 백슬래시로 인해 다음 문자가 문자 그대로 해석되고(다음 문자가 해당 문자 중 하나인 경우) 셸 조각이 "test\n\\test"
문자열로 확장됩니다 . 그렇지 않으면 백슬래시 자체가 문자 그대로 해석됩니다. 그런 다음 줄 바꿈과 탭 으로 바꾸십시오 .test\n\test
"$\`
echo -e
\n
\t
리터럴 텍스트를 인용하기 위해 큰따옴표를 사용하지 마십시오. 대신 작은따옴표를 사용하세요. 규칙은 더 간단합니다. 작은따옴표 안의 모든 내용은 문자 그대로 작은따옴표로 해석됩니다. 큰따옴표를 사용하기로 선택한 경우 뒤에 인용할 문자가 없는 백슬래시를 사용하지 마십시오. 큰따옴표 안에 백슬래시를 사용하려면 백슬래시를 사용하십시오 \\
.
echo -e 'test\n\\test'
echo -e "test\\n\\\\test"