Bash의 에코 줄 바꿈 문자 리터럴 \ n


2362

Bash에서 다음을 시도하십시오.

echo -e "hello\nworld"

그러나 개행은 인쇄하지 않습니다 \n. 줄 바꿈을 인쇄하려면 어떻게해야합니까?

우분투 11.04를 사용하고 있습니다.


264
"나에게 효과적"이라고 말하는 사람들에게 에코의 동작은 버전마다 약간 씩 다릅니다. 일부는 출력의 일부로 "-e"를 인쇄하기도합니다. 사소하지 않은 것에 대해 예측 가능한 동작을 원한다면 @sth의 대답과 같이 printf를 대신 사용하십시오.
Gordon Davisson

6
내가 얻을 수 있는 것이 밝혀, 나는 함수에서 그 사용하려고 시도했습니다 때문에,이 응답 작업의 제안을 값을 반환 하고, 기능의 모든 에코 (와의 printf) 메시지에 추가되고 있었다 리턴 값 후에 개별적 바꿈 빼앗긴 . 여기에 매우 철저한 답변이있는 질문이 있습니다 : stackoverflow.com/questions/27872069/… 이것은 3 시간의 미스터리 투어와 같았습니다.
aliteralmind

8
또한 주목할 : 유닉스 및 리눅스 스택 거래소,에서 허용 대답에코 사용하는 경우 새 줄을 추가하는 방법
그레이엄 페린

@GrahamPerrin, 정말 훌륭하고 자세한 답변에 대한 링크에 감사드립니다! 아래 답변보다 낫다고 생각합니다.
Konstantin

2
echo -ne "hello \ nworld"(이스케이프를 해석하려면 n 플래그가 필요했습니다)-다른 사람들이 말했듯이 다른 echo 명령은 다른 결과를 가질 수 있습니다!
Konchog

답변:


2875

printf대신 사용할 수 있습니다 .

printf "hello\nworld\n"

printf보다 일관된 동작이 echo있습니다. 동작은 echo버전마다 크게 다릅니다.


49
또는 printf %"s\n" hello world- 너무 많은 인수가 주어지면의 printf는 형식을 다시 사용합니다
글렌 잭맨

28
OP는 printf가 아니라 echo에 대해 물었다. -e 옵션을 사용하는 아래 @choroba의 답변은 청구서를 완벽하게 채 웁니다.
JESii

57
@JESii : 옵션 echo을 지원하는 경우 적합합니다 -e.
sth

11
일부 버전으로 echo, -e나는이 대답이 있기 때문에 완벽하게 유효 생각, 그래서 그냥 출력 자체에 인쇄 echo(우리는 특정 버전에 대해 얘기하지 않는 한) 여기에 일치하지 않습니다.
Tejas Manohar 2016 년

14
printf를 사용할 수 있다면 이것은 좋고 좋습니다. 그러나 echo와는 달리 printf가 distro에없는 경우도 있습니다.
bigtunacan

1712

당신은 강타에 확실합니까? 네 가지 방법 모두 나를 위해 작동합니다.

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world

368
-e 플래그가 "역 슬래시 이스케이프의 해석을 가능하게"
해주었습니다.

21
-e모든 * nix OS에 param이 존재하지 않는 것
같습니다

12
@ kenorb : bash에 존재합니다. 내장입니다.
choroba

세 번째 이유는 무엇입니까? $ 없이는 "안녕하세요 N 세계"를 반환
에반 도노반

21
다양한 other -e에서 언급했듯이 모든 배포 및 버전에서 작동하지 않습니다. 어떤 경우에는 무시되고 다른 경우에는 실제로 인쇄됩니다. 나는 이것이 OP를 위해 그것을 고쳤다 고 생각하지 않기 때문에 대답을 받아 들여서는 안된다
csga5000

578
echo $'hello\nworld'

인쇄물

hello
world

$''문자열은 ANSI C Quoting을 사용 합니다 .

형식의 단어는 특별히 취급됩니다. ANSI C 표준에 지정된대로 백 슬래시 이스케이프 문자를 바꾸어 단어를 string으로 확장합니다 .$'string'


15
@EvgeniSergeev 무슨 뜻인지 잘 모르겠지만, 처음에는 효과가 없었습니다. 그리고 큰 따옴표를 사용하고 있기 때문에 작은 따옴표로만 작동합니다. Mac의 터미널에서 시도했습니다.
trss

11
문자열에서 변수가 확장되지 않는 문제.
willemdh 2016

여전히 큰 따옴표 문자열을 연결할 수 있습니다. `foo = "bar"; echo $ ''$ foo'efoot'`
Kamafeather

141

당신은 항상 할 수 echo ""있습니다.

예 :

echo "Hello"
echo ""
echo "World"

6
echo ""나에게 도움이되며 질문에 직접 대답하지 않아도 새 줄을 인쇄하는 것이 가장 간단한 양식이라고 생각합니다. 건배.
마리오 아 와드

2
나는 그것이보다 명확하지 않고 따라서 잠재적으로 더 혼란 스럽다고 생각합니다 echo -en "\n".
DBedrenko

72
echo빈 줄을 얻기에 충분합니다
ROMANIA_engineer

5
@Okneloper 저에게 잘 작동합니다.
Matthew 읽기

71

시험

echo -e "hello\nworld"
hello
world

nano에디터 에서 저를 위해 일했습니다 .

매뉴얼 페이지에서 :

-e 백 슬래시 이스케이프 해석 가능


41

동료의 대본이 줄 바꿈을 인쇄하지 않는 이유를 알아 내려고 벽에서 머리를 두드리는 사람이 있다면 기회를 찾아보십시오.

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

echo $(GET_RECORDS);

위에서와 같이, 메소드의 실제 실행은 메소드 자체에있을 수있는 에코를 대체하는 에코로 랩핑 될 수 있습니다. 분명히 나는 ​​간결성을 위해 이것을 물을 뿌렸다. 발견하기 쉽지 않았다!

그런 다음 동료에게 기능을 실행하는 더 좋은 방법은 다음과 같다고 알릴 수 있습니다.

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;

메소드에서 변수를 반향하기 전에 변수를 따옴표로 묶어야합니다.
ingyhere

23

이것은 Raspbian에서 저에게 효과적입니다.

echo -e "hello\\nworld"

2
Windows 7의 GitBash에서도 작동합니다. ;-)
Big Rich

3
단일 백 슬래시이면 충분합니다
Felix D.

23

에코의 POSIX 7

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e 정의되지 않았으며 백 슬래시는 구현 정의입니다.

첫 번째 피연산자가 -n이거나 피연산자 중 하나에 <backslash> 문자가 포함 된 경우 결과는 구현 정의됩니다.

선택적 XSI 확장이없는 한.

따라서 printf대신 다음을 사용 하는 것이 좋습니다 .

형식 피연산자는 XBD 파일 형식 표기법 [...]에 설명 된 형식 문자열로 사용됩니다.

파일 형식 표기 :

\ n <newline> 인쇄 위치를 다음 줄의 시작 부분으로 이동하십시오.

또한 Ubuntu 15.10과 대부분의 배포판 echo은 다음과 같이 구현 됩니다.

  • 배쉬 내장 : help echo
  • 독립형 실행 파일 : which echo

혼동을 일으킬 수 있습니다.


17

간단히 입력

echo

새로운 줄을 얻기 위해


3
과소 평가 된이 답변은 2011 년 이후이 질문에 20 개 이상의 답변이 포함되어 있고 그 중 어느 것도이 간단한 솔루션을 포함하고 있지 않다고 믿을 수 없습니다.
Prometheus

별명 c = 'echo; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; 에코; ' 화면을 지우는 유일한 방법입니다. 감사합니다!
Ahi Tuna

@Ahi Tuna : 대신 콘솔 키보드 단축키를 사용하십시오 :)
R Sun

@RSun 그리고 크롬 북의 데비안 터미널 창에서 어떻게해야합니까?
Ahi Tuna

1
@AhiTuna 취소; 또는 ctrl + l;
마이크 씨앗

16
str='hello\nworld'
$ echo | sed "i$str"
hello
world

문자열 연결에 작동하기 때문에 실제로 큰 대답입니다. 큰!
LavaScornedOven

1
왜 두 번째 프로그램을 불러야 하는가? 우리가 bash에서 실시간 응용 프로그램을 작성하려고하는 것은 아니지만 반드시 필요하지는 않습니다.
Felix D.

이것은 실제로 무엇이든 상관없이 모든 곳에서 작동 해야하는 훌륭한 대답입니다. 내 친구 @alinsoar
Kashyap Kotak


6

당신은 또한 할 수 있습니다 :

echo "hello
world"

이것은 스크립트 내부와 명령 줄에서 모두 작동합니다.
명령 행에서 Shift+ Enter를 눌러 문자열 내부에서 줄 바꿈을 수행하십시오.

이것은 내 macOS 및 Ubuntu 18.04에서 작동합니다.


Ènter`를 눌렀을 때 쉘이 명령을 실행하지 않고 어떻게 줄 바꿈을 입력합니까?
Xenos

@Xenos 이것은 스크립트에서 잘 작동합니다. 콘솔에서 Shift + Enter를 클릭하면 쉘이 미완료 명령을 실행하지 않도록 새 줄을 추가 할 수 있습니다.
vinzee

5

이러한 솔루션으로 작동하지 않고 함수에서 반환 값을 가져와야하는 사람들을 위해 여기에 하나 더 입력하십시오.

function foo()
{
    local v="Dimi";
    local s="";
    .....
    s+="Some message here $v $1\n"
    .....
    echo $s
}

r=$(foo "my message");
echo -e $r;

이 트릭만이 bash로 작업하고있는 Linux에서 작동했습니다.

GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)

그것이 비슷한 문제를 가진 사람을 돕기를 바랍니다.


4

내 스크립트 :

echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings

산출:

WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:

내 bash 스크립트에서 방금 시도 할 때까지 나는 너에게 화를 냈다.

echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"

해당 점프를 삽입하려는 곳에 Enter 키를 누르십시오. 출력 결과는 다음과 같습니다.

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:

4
참고로 변수 이름 주위에 $ {}을 사용하고 싶을 때 쉘이 $ warningsFound라는 변수를 찾아서 두 개의 개별 출력이 아닌 그것을 인쇄 할 때 실제로 이상한 동작을 일으킬 수 있으므로 아마도 $ {}을 사용하고 싶을 것입니다.
dragon788

@ dragon788 어쩌면 뭔가 빠졌지 만 실제로 변수는 $ warningsFound?
psynnott

2
나는 그것에 관한 단어를 놓쳤다. $ warnings라는 변수가있는 경우 $ {warningsFound}를 사용하지 않는 경우 의도 한 변수 대신 $ warnings + "Found"의 내용으로 끝날 수 있습니다.
dragon788

3

중괄호와 함께 에코를 사용할 수도 있습니다.

$ (echo hello; echo world)
hello
world

예기치 않은 토큰 '('의 .sh 파일에서 호출 근처의 구문 오류
cosbor11

1
시도echo hello; echo world
Avinash Raj

1
또는 "echo hello && echo world"또는 just : "echo hello echo world
csga5000

3

이것은 다음과 같이 더 잘 수행 될 수 있습니다

x="\n"
echo -ne $x

-e 옵션은 이스케이프 시퀀스의 백 슬래시를 해석합니다.
-n 옵션은 출력에서 ​​후행 줄 바꿈을 제거합니다.

추신 : echo 명령은 항상 출력에 후행 줄 바꿈을 포함시키는 영향을 미치므로 해당 항목을 끄려면 -n이 필요합니다.


에코 -ne : 질문의 정확한 답변 "안녕하세요 \ nworld"
Dhwanit

3

이스케이프 시퀀스를 해석 하는 새로운 매개 변수 확장이 추가되었습니다 bash 4.4.

${parameter@operator} - E operator

확장은 $'…'인용 메커니즘 과 같이 확장 된 백 슬래시 이스케이프 시퀀스가있는 매개 변수의 값인 문자열입니다 .

$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world

2

스크립트를 작성 중이고 다른 메시지의 일부로 줄 바꿈을 여러 번 반복하는 경우 플랫폼 간 해결책은 다음과 같이 변수에 리터럴 줄 바꿈을 넣는 것입니다.

newline='
'

echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined

0

때로는 공백으로 구분 된 여러 문자열을 전달할 수 있으며로 해석됩니다 \n.

예를 들어 여러 줄 알림에 쉘 스크립트를 사용하는 경우 :

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`

이것은 올바르지 않습니다. 로 해석되지 않습니다 \n. 프로그램에 대한 별도의 인수로 해석되며 프로그램 자체는 해당 인수를 새로운 행에 표시 할 수 있지만, 이것이 \n어느 시점에서든 변환되어 프로그램에 전적으로 의존 한다는 것을 의미하지는 않습니다 .
Score_Under

0

bash 프로필 (MacOx, iTerm)에서 별칭으로 사용하는 동안 텍스트를 큰 따옴표로 묶어야했습니다.

alias helloworld="echo -e \"hello \n world\""

0

이것은 나를 거기에 데려 갔다.…

outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff

수율 :

RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]


-2

추가 솔루션 :

긴 코드를 여러 줄로 묶어야하는 경우 (예 : 코드 / 구성)

예를 들면 다음과 같습니다.

  • 코드 / 구성을 생성하는 Bash 스크립트

echo -e, printf일부 제한이있을 수 있습니다

특수 문자를 자리 표시 자로 줄 바꿈으로 사용하고 (예 ~:) 파일을 사용하여 파일을 만든 후 바꿀 수 있습니다tr

echo ${content} | tr '~' '\n' > $targetFile

tr훌륭한 IMO 여야하는 다른 프로그램 ( ) 을 호출 해야합니다.

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