쉘 스크립트에서 줄 바꿈이없는 'echo'


540

echo내 스크립트에 문제가 있습니다.

echo -n "Some string..."

인쇄물

-n Some string...

다음 줄로 이동합니다. 콘솔에서 줄 바꿈없이 올바르게 작동합니다.

Some string...

2
어떤 Bourne Shell 구현을 사용하고 있습니까? bashbourne shell 모드로 실행하면 여기서 잘 작동합니다. 또한 대화식 쉘로 Bourne 쉘을 실제로 사용하고 있지 않을 수도 있습니다.
FatalError

4
우분투에서 :echo -ne "text without new line: "; echo "some text";
zsoltii

나는 이것이 매우 오래되었다는 것을 알고 있지만 이것은 줄 바꿈없이 마침표를 추가하기 위해 Windows 10에서 작동합니다. echo | / p = "를 설정하십시오."
뿌림

답변:


572

echo동작이 다른 여러 버전의 명령이 있습니다. 분명히 스크립트에 사용 된 쉘은 인식하지 못하는 버전을 사용합니다 -n.

printf명령에는 훨씬 더 일관된 동작이 있습니다. echo와 같은 간단한 작업 echo hello에는 적합하지만 printf더 복잡한 작업에 사용 하는 것이 좋습니다 .

어떤 시스템을 사용하고 있으며 스크립트에서 사용하는 쉘은 무엇입니까?


46
라인으로 시작하여 #!/bin/bash작동했습니다. 일반적으로 bash와 함께 일하고 있습니다.
qwertz

CMD에는 Windows와 동등한 기능이 있었으면 좋겠습니다. (내가 알 수있는 한, 동일한 동작을 달성하기위한 해결 방법은 없습니다.
kayleeFrye_onDeck

2
@kayleeFrye_onDeck : 아마도 Windows 버전의 printf명령이있을 것입니다.
Keith Thompson

나는 원한다. echo항상 줄 바꿈을 추가합니다 ... 해결 방법은 기발합니다.
kayleeFrye_onDeck

2
@alper %쉘 프롬프트입니다. 이것을 시도하고주의 깊게보십시오 :printf hello; sleep 5
Keith Thompson

150

bash "echo"라는 "내장"명령이 있습니다.

$ type echo
echo is a shell builtin

또한 적절한 실행 파일 인 "echo"명령 (즉, /bin/echo해석 echo및 실행과 반대로 쉘 포크 및 execs )이 있습니다.

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

하나의 동작 echo에의 WRT \c와는 -n다릅니다. 가장 좋은 방법 printf은를 사용하는 것입니다. 이것은 내가 본 네 가지 * NIX 맛에서 사용할 수 있습니다.

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

3
깊이있는 답변에 감사드립니다!
Darth Egregious

91

함께 시도

echo -e "Some string...\c"

예상대로 작동합니다 (귀하의 질문에서 알 수 있듯이).

이 정보는 man페이지 에서 얻었습니다 . 이 man페이지는 또한 쉘에 자체 버전이있을 수 있으며 자체 버전이 echo있는지 확실하지 않습니다 bash.


-ne 옵션을 인식하지 못하는 echo가 아마도 -e (또는 필요하지 않은) 옵션도 인식하지 못하므로 echo "some string...\c"대신 말하기 를 원할 것입니다. 그러나 매우 다른 echo 명령을 사용하여 여러 bash 변형을 지원 해야하는 경우 printf를 사용하는 것이 더 좋거나 echo 명령 기능을 확인해야합니다 [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(적어도 bash는 \ c도 지원하므로 사용할 필요가 없습니다) -n 옵션이지만 bash에는 -e가 필요합니다)
Timo

나에게 이것은 OP의 경우 -n 이하는 일을 정확하게 수행합니다 : 출력 리터럴 -e. 나는 printf와 참 일관성 추측
aexl

-e는 posix 쉘 스크립트에서 작동하지 않으며 대신 화면에 출력됩니다.
토머스 디간

7

이것을 달성하기 위해 기본적으로 자주 사용하는 두 가지 방법이 있습니다.

1. 은 Using 커서 이스케이프 문자 ( \c)로를echo -e

:

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -e플래그는 가능 E의 문자열에 풍경 문자.
  • \c제공 C의 현재 행에 ursor 백을.

또는

2.printf 명령 사용

:

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4

3

"읽기"와 같은 다른 명령과 함께 if 내부에서 echo를 사용하면 설정을 무시할 수 있으며 어쨌든 새 줄로 넘어갑니다.



1

나는 지금 아래와 같이 출력물을 믿습니다.

~ echo -e "String1\nString2"
String1
String2

xargs여러 줄 stdout을 같은 줄로 가져 오는 데 사용할 수 있습니다 .

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~

0

쉘 스크립트를 작성하고 쓸 때 항상 첫 줄을 #! / usr / bin / env bash로 넣으십시오. 이 쉘은 이스케이프 시퀀스를 생략하거나 조작하지 않습니다. ex echo "첫 번째 \ n 줄입니다"인쇄 이것은 첫 번째 \ n 줄입니다.


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