echo -e“<string>”과 echo $“<string>”의 차이점


20

사용의 차이점은 무엇입니까

echo -e "Hello\nWorld" 

echo $"Hello\nWorld" 

그들은 둘 다 출력하지 않습니다 :

Hello
World

1
해봤 어? 두 번째는 출력 Hello\nWorld합니다. -e이스케이프 문자를 해석 하려면 스위치가 필요합니다 .
becko

4
두 번째로 작은 따옴표로 씁니다 echo $'Hello\nWorld'. bash 아래에 두 줄로 인쇄됩니다.
John1024

@ becko, 그래 나는 그것을 시도하고 그들은 똑같은 것을 출력했다.
Mark

답변:


33

echo -e그리고 echo $'...'그들은 다음과 같은 이스케이프 시퀀스를 지원하는 점에서 유사 모두 :

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

차이점이 있습니다. 위의 사항 외에도 다음을 echo -e지원합니다.

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

대조적으로 다음을 $'....'지원합니다.

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

둘 사이에서 \c확장이 호환되지 않는지 확인하십시오.

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

들면 echo -e\c하여 무시하고, 상기 출력을 억제한다 Istop. 반면, 대한 $'...'의이 \cI탭으로 해석됩니다.

시각적으로 비슷한 형태 : $"..."

와 달리 $'...'기능 $"..."은 상당히 다릅니다. 현재 로케일에 따라 포함 된 문자열이 변환됩니다.

echo -e논란

echo -e쉘에서 보편적으로 지원되지 않으며 많은 사람들이 -e옵션을 디자인 실수라고 생각합니다. 관찰 :

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

보시다시피, 인쇄 대상 echo이 대시 로 시작하면 결과가 예상치 못한 것일 수 있습니다. 인쇄 할 첫 번째 문자열이 echo대시로 시작하지 않는 것이 확실 하지 않으면을 사용하는 것이 좋습니다 printf.

이러한 이유로 POSIX 표준은 다음과 같이 결론을 내립니다 .

새로운 응용 프로그램에서는 에코 대신 printf를 사용하는 것이 좋습니다.

bash지난 22 년간 유지해온 Chet Ramey는 다음 에 동의합니다 .

[N] 모든 코드는 printf를 사용해야합니다.


1
또한 ChetPOSIX 는 둘 다를 사용 printf하지 말 것을 권장합니다.echo
geirha

@geirha 아주 좋은 포인트. 답변이 업데이트되었습니다.
John1024

1
글로브와 같은 예기치 않은 옵션 문제는 *실제로 특정되지 않습니다 echo. 짧거나 긴 옵션 (일반적인 방식으로 작성 됨)을 인식하고를 포함하여ls 파일 이름 피연산자를 사용하는 모든 명령에서 발생합니다 . 논란의 여지가 있지만 echo(소스에서 언급했듯이) echo일반적으로 --옵션의 끝을 나타내는 것을 받아들이지 않는 반면에와 같은 명령을 작성할 수 있기 때문에 상황이 조금 더 나쁩니다 ls -- *l. (그리고 실제로 는 스크립트에서 *또는로 시작하는 글로브를 사용할 때 일반적으로 이런 식으로 명령을 작성해야합니다 -.)
Eliah Kagan

철저한 답변을 주셔서 감사합니다, 나는 물론 내 운영 체제에 대한 훈련을하고 난 사용하여 텍스트를 인쇄 할 필요가 \n내가 사용하는 경우 그래서 실제로는 중요하지 않습니다, 이스케이프 시퀀스를 echo -e '...', echo $'...'또는echo $"..."
마크
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.