Echo newline ใน Bash พิมพ์ตามตัวอักษร \ n


2363

ใน Bash ให้ลองสิ่งนี้:

echo -e "hello\nworld"

\nแต่ก็ไม่ได้พิมพ์ขึ้นบรรทัดใหม่เท่านั้น ฉันจะทำให้มันพิมพ์บรรทัดใหม่ได้อย่างไร

ฉันใช้ Ubuntu 11.04


264
สำหรับผู้ที่พูดว่า "ใช้งานได้กับฉัน" พฤติกรรมของเสียงสะท้อนนั้นแตกต่างกันเล็กน้อยระหว่างเวอร์ชั่น บางคนก็จะพิมพ์ "-e" เป็นส่วนหนึ่งของการส่งออกของพวกเขา หากคุณต้องการพฤติกรรมที่คาดเดาได้สำหรับสิ่งที่ไม่สำคัญให้ใช้ printf แทน (ตามคำตอบของ @ sth)
Gordon Davisson

6
ฉันไม่สามารถรับข้อเสนอแนะใด ๆในคำตอบนี้ได้เพราะเมื่อมันปรากฏออกมาฉันพยายามใช้มันในฟังก์ชั่นที่คืนค่าและข้อความ echo (และ printf) ทั้งหมดในฟังก์ชั่นถูกต่อท้าย ค่าตอบแทนหลังจากที่ถูกปล้นเป็นรายบุคคลของการขึ้นบรรทัดใหม่ นี่คือคำถามเกี่ยวกับเรื่องนี้พร้อมคำตอบที่ละเอียดมาก: stackoverflow.com/questions/27872069/…นี่เป็นเหมือนทัวร์ลึกลับสามชั่วโมง
aliteralmind

8
ยังโดดเด่น: ใน Unix & Linux Stack Exchange, คำตอบที่ได้รับการยอมรับในการเพิ่มบรรทัดใหม่เมื่อใช้ echo
Graham Perrin

@ GrahamPerrin ขอบคุณสำหรับลิงค์ไปยังคำตอบที่ดีและมีรายละเอียดอย่างแน่นอน! ฉันคิดว่าดีกว่าคำตอบด้านล่าง
Konstantin

2
echo -ne "hello \ nworld" (คุณต้องการแฟล็ก n เพื่อตีความการหลบหนี) - แต่อย่างที่คนอื่นพูดคำสั่ง echo ที่ต่างกันอาจมีผลลัพธ์ที่แตกต่างกัน!
Konchog

คำตอบ:


2876

คุณสามารถใช้printfแทน:

printf "hello\nworld\n"

printfechoมีพฤติกรรมที่สอดคล้องกันมากขึ้นกว่า พฤติกรรมของechoแตกต่างกันอย่างมากระหว่างรุ่นที่แตกต่างกัน


49
หรือแม้กระทั่งprintf %"s\n" hello world- printf จะนำรูปแบบมาใช้ซ้ำหากมีการโต้แย้งมากเกินไป
glenn jackman

28
OP ถามเกี่ยวกับ echo ไม่ใช่ printf; และคำตอบของ @ choroba ด้านล่างซึ่งใช้ตัวเลือก -e เติมเงินให้สมบูรณ์
JESii

57
@JESii: มันเหมาะถ้าคุณechoเกิดขึ้นเพื่อสนับสนุน-eตัวเลือก
sth

11
กับบางรุ่นecho, -eถูกพิมพ์เพียงในการส่งออกของตัวเองดังนั้นฉันคิดว่าคำตอบนี้เป็นที่ถูกต้องสมบูรณ์ตั้งแต่echoไม่สอดคล้องที่นี่ (ยกเว้นกรณีที่เรากำลังพูดถึงรุ่นที่เฉพาะเจาะจง)
Tejas Manohar

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 ทำเพื่อฉันซึ่ง "เปิดใช้การตีความแบคสแลชหนี"
tandy

21
ผมคิดว่า-eพารามิเตอร์ไม่ได้อยู่ในทุก OS ระวัง *
kenorb

12
@kenorb: มันมีอยู่ในทุบตี มันเป็นแบบ builtin
choroba

ทำไมคนที่สามถึงทำงาน หากไม่มี $ จะส่งคืน "Hello n world"
Evan Donovan

21
ตามที่กล่าวถึงโดยอื่น ๆ -e ไม่ทำงานสำหรับการแจกแจงและรุ่นทั้งหมด ในบางกรณีจะถูกละเว้นและในบางกรณีจะถูกพิมพ์ออกมาจริง ๆ ฉันไม่เชื่อว่าสิ่งนี้จะแก้ไขได้สำหรับ OP ดังนั้นจึงไม่ควรได้รับคำตอบ
csga5000

578
echo $'hello\nworld'

พิมพ์

hello
world

$''สตริงใช้ANSI C Quoting :

คำของแบบฟอร์มได้รับการปฏิบัติเป็นพิเศษ คำนี้ขยายออกเป็นสตริงด้วยอักขระเครื่องหมายทับขวาทับกลับแทนที่ตามที่ระบุโดยมาตรฐาน ANSI C$'string'


15
@EvgeniSergeev ไม่แน่ใจว่าคุณหมายถึงอะไร แต่ก็ไม่ได้ผลกับฉันก่อน และนั่นเป็นเพราะฉันใช้เครื่องหมายคำพูดคู่และปรากฎว่าสิ่งนี้ใช้ได้กับคำพูดเดียวเท่านั้น! พยายามใน Terminal บน Mac
trss

11
ปัญหาเกี่ยวกับตัวแปรในสตริงที่ไม่ถูกขยาย
willemdh

คุณยังคงสามารถเชื่อมสตริงที่มีเครื่องหมายคำพูดคู่ได้ `foo =" bar "; echo $ '' $ foo'efoot'`
Kamafeather

141

echo ""คุณก็สามารถทำ

เช่น

echo "Hello"
echo ""
echo "World"

6
echo ""เหมาะกับฉันและฉันคิดว่ามันเป็นรูปแบบที่ง่ายที่สุดในการพิมพ์บรรทัดใหม่แม้ว่านี่จะไม่ตอบคำถามโดยตรงก็ตาม ไชโย
Mario Awad

2
ฉันคิดว่ามันชัดเจนน้อย echo -en "\n"(และอาจทำให้เกิดความสับสนมากขึ้นกว่า)
DBedrenko

72
echoก็เพียงพอที่จะรับบรรทัดว่าง
ROMANIA_engineer

5
@ ผู้พัฒนาทำงานได้ดีสำหรับฉัน
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
ใช้งานได้กับฉันใน GitBash บน Windows 7 เช่นกัน ;-)
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 และ distros ส่วนใหญ่ใช้งานechoทั้งสองอย่างดังนี้:

  • Bash ในตัว: help echo
  • ปฏิบัติการแบบสแตนด์อโลน: which echo

ซึ่งอาจนำไปสู่ความสับสน


17

เพียงพิมพ์

echo

เพื่อรับบรรทัดใหม่


3
คำตอบที่ต่ำกว่าความจริงไม่น่าเชื่อว่าคำถามนี้มีคำตอบมากกว่า 20 คำตอบตั้งแต่ปี 2011 และนั่นไม่ใช่คำตอบเดียวที่มีคำตอบง่ายๆนี้
โพร

นามแฝง c = 'echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; echo; ' นี่เป็นวิธีเดียวที่ฉันสามารถล้างหน้าจอของฉันขอบคุณ!
Ahi Tuna เมื่อ

@Ahi Tuna: โปรดใช้แป้นพิมพ์ลัดของคอนโซลแทน :)
อาทิตย์ที่

@RSun และฉันจะทำสิ่งนั้นบนหน้าต่างเทอร์มินัล Debian บน Chromebook ได้อย่างไร
Ahi Tuna

1
@ AhiTuna ชัดเจน หรือ ctrl + l;
Mike Seeds

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

นี่เป็นคำตอบที่ดีมากเพราะใช้สำหรับการเรียงสตริง ที่ดี!
LavaScornedOven

1
เหตุใดจึงต้องเรียกใช้โปรแกรมที่สอง ไม่ใช่ว่าเราพยายามเขียนแอปพลิเคชันตามเวลาจริงใน bash;) แต่ไม่จำเป็น
เฟลิกซ์ดี.

นี่เป็นคำตอบที่ดีมากซึ่งควรทำงานได้ทุกที่ไม่ว่าอะไรจะเกิดขึ้น คุณบันทึกเพื่อนวันของฉัน @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;

เฉพาะเคล็ดลับนี้ทำงานใน 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:

ในสคริปต์ทุบตีของฉันฉันเริ่มโกรธคุณจนฉันเพิ่งลอง:

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" หรือเพียงแค่: "echo hello echo world
csga5000

3

สิ่งนี้น่าจะดีกว่า

x="\n"
echo -ne $x

ตัวเลือก e- จะตีความ backslahes สำหรับลำดับหนี
ตัวเลือก -n จะลบขึ้นบรรทัดใหม่ในการส่งออก

PS: คำสั่ง echo มีผลกระทบเสมอรวมถึงบรรทัดใหม่ต่อท้ายในเอาต์พุตดังนั้น -n จำเป็นต้องปิดสิ่งนั้น (และทำให้สับสนน้อยลง)


ก้อง -ne "สวัสดี \ nworld" สำหรับคำตอบที่แน่นอนของคำถาม :)
Dhwanit

3

มีการขยายพารามิเตอร์ใหม่ที่ เพิ่มในการตีความลำดับหนี:bash 4.4

${parameter@operator} - E operator

การขยายตัวเป็นสตริงที่เป็นค่าของพารามิเตอร์ที่มีลำดับ backslash escape ขยายเช่นเดียวกับ$'…'กลไกการอ้างอิง

$ 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

ฉันต้องล้อมรอบข้อความด้วยอัญประกาศคู่ในขณะที่ใช้เป็นนามแฝงในโปรไฟล์ทุบตี (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

ทางออกเพิ่มเติม:

ในกรณีที่คุณต้อง echo หลายเนื้อหายาว (เช่นรหัส / การกำหนดค่า)

ตัวอย่างเช่น :

  • Bash script เพื่อสร้างรหัส / การกำหนดค่า

echo -e, printfอาจมีข้อ จำกัด บางอย่าง

คุณสามารถใช้อักขระพิเศษบางอย่างเป็นตัวยึดตำแหน่งเป็นตัวแบ่งบรรทัด (เช่น~) และแทนที่หลังจากสร้างไฟล์โดยใช้tr

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

จำเป็นต้องเรียกใช้โปรแกรมอื่น ( tr) ซึ่งควรเป็น IMO ที่ใช้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.