"echo -e"명령이 올바른 출력을 생성하지 않는 이유는 무엇입니까?


21

Ubuntu 18.04 LTS의 터미널 에서이 명령을 쓸 때 :

echo -e "Hello\\\n"

출력으로 제공합니다.

Hello\n

그러나 매뉴얼 페이지 에서 다음과 같이 인쇄해야합니다 .

Hello\

즉, 먼저 print Hello를 누른 \다음 개행 문자 (및 다른 개행 문자)를 인쇄합니다. 문제는 어디에 있습니까?

다음의 몇 가지 echo -e명령과 출력을 참조하십시오 .

man420@man420-X542UQ:~$ echo -e "HEllo\a\a\a\a\a\a\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\a\\\n"
HEllo\n

yes.for 처음 2 \ 그것을해야 출력 a를 \ .and 마지막 \ n은 \가 안녕을 인쇄해야하는 이유 .so를 백 슬래시 이스케이프 \ n (새로운 라인) 만들기
yolin00

1
따옴표없이 시도하십시오.
ajgringo619

2
Eliah Kagan은 놀라운 답변을 제공했습니다.
바나듐

2
echo처음 에는 사용하지 마십시오 : use printf.
chepner

2
작성하는 내용이 인수로 명령에 전달 된 내용과 정확히 일치하도록하려면 항상 작은 따옴표를 사용하십시오.
Giacomo Alzetta

답변:


29

백 슬래시는 특별히으로 취급 echo -e하지만, 먼저 그들은된다 가끔 (이 경우에 쉘에 의해 특별하게 처리 bash쉘의에 따라) 인용 규칙.

echo실제로 보는 주장 은 Hello\\n입니다. 당신이 통과하기 때문에 -eecho, 그것은 특별히 백 슬래시 이스케이프를 처리하고 \\단일로 축소되어 \. 최종 n은 이스케이프되지 않으므로 문자 그대로 나타납니다.

그 이유 echo는 쉘 자체 의 작동 이전과는 별도로 쉘 이 일부 상황 에서는 \특별하게 취급 하지만 다른 상황에서는 그렇지 않기 때문입니다. 인용 부호가없는 \문자는 항상 특별하게 처리되고, 작은 따옴표 \ 는 특수하게 처리되지 않지만, 실행 된 명령에서와 같이 큰 따옴표 \ 문자 의 처리 는 더 미묘하고 복잡합니다.

쉘과 같은 명령을 두 번 인용 텍스트, 발견하면 "Hello\\\n", 그것은 치료 \그 자체가 특별한 의미 따옴표 안에있을 수있는 문자 앞에 때 이스케이프 문자로를 하지, 그렇지 .

  1. \때때로 내부에 특별한 의미가 있기 때문에 "", \바로 앞에 있는 a 는 \그 초를 인용하는 효과가 \있습니다. 따라서 큰 따옴표 안에 첫 번째 \\는으로 축소됩니다 \.
  2. 첫 두 \문자 뒤에는 첫 두 문자에 \영향을받지 않고 앞에있는 세 번째 문자가 있습니다 n. 그러나 n큰 따옴표 안에 특수하게 취급되는 문자는 아니므로 \이전에는 특수하게 취급되지 않습니다. 따라서 \n유지됩니다 \n.

결과는 큰 따옴표로 \\\n로 해석됩니다 \\n.

echo -e볼 때 \\n첫 번째 \는 두 번째에서 특별한 의미를 제거하므로 문자 그대로 해당 텍스트를 echo인쇄 \n합니다.


당신의 목표가 Hello추가 줄 바꿈 으로 인쇄 하지만 백 슬래시가없는 것 (질문은 원래 이것에 대해 모호하고 유용한 예라고 생각합니다)이라면, 한 가지 해결책은을 제거하는 것 \입니다. 끝에 추가 줄 바꿈으로 echo -e "Hello\\n"출력 Hello을 실행 합니다 .

더 나은 해결책은 작은 따옴표를 사용하고 쓰는 것 echo -e 'Hello\n'입니다. 작은 따옴표는 가장 강력한 인용 형식입니다. 더 좋은 해결책은 일반적으로 printf대신에 사용 하는 echo것입니다 printf 'Hello\n\n'.

Hello\백 슬래시와 추가 줄 바꿈을 포함하여 인쇄하는 것이 목표라면 이중 인용 방식이 가능하지만 번거 롭습니다. : 작업 거꾸로 알아낼 echo -e변환 \\\\n줄 바꿈에 두 번 인용 변환 \\에를 \당신이 여섯 백 슬래시 (함께 할 수 있도록 echo -e "Hello\\\\\\n") 때문에, \\n로 회전 \n하나로 인해 백 슬래시가 서로를 탈출. 큰 따옴표는 이스케이프되지 않은 \n경우에도 유지되므로 5로도 할 수 있습니다 \.

이것은 작은 따옴표의 장점을 보여줍니다 : echo -e작은 따옴표 ( echo -e 'Hello\\\n') 안에보고 싶은 것을 넣으 십시오 . printf여기도 좋습니다. 하나의 옵션은 printf 'Hello\\\n\n'입니다. 그러나 printf실제로 빛나는 부분은 추가 인수를 연결할 수 있다는 것입니다. 대신에 printf '%s\n\n' 'Hello\'두 번째 인수 ( Hello\작은 따옴표는 아무 것도 변경하지 않기 때문에 문자 그대로)를 삽입하는을 사용할 수 있습니다 %s.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.