Echo dòng mới trong Bash in chữ \ n


2363

Trong Bash, đã thử điều này:

echo -e "hello\nworld"

Nhưng nó không in một dòng mới, chỉ \n. Làm thế nào tôi có thể làm cho nó in dòng mới?

Tôi đang sử dụng Ubuntu 11.04.


264
Đối với những người nói "nó hoạt động với tôi", hành vi của tiếng vang thay đổi khá nhiều giữa các phiên bản. Một số thậm chí sẽ in "-e" như một phần của đầu ra của họ. Nếu bạn muốn hành vi có thể dự đoán được cho bất cứ điều gì không cần thiết, thay vào đó hãy sử dụng printf (như trong câu trả lời của @ sth).
Gordon Davisson

6
Tôi không thể làm cho bất kỳ đề xuất nào trong câu trả lời này hoạt động, bởi vì, hóa ra, tôi đã cố gắng sử dụng nó trong một hàm trả về một giá trị và tất cả các thông báo echo (và printf) trong chức năng đã được thêm vào giá trị trả về sau khi bị tước riêng dòng mới . Đây là một câu hỏi liên quan đến vấn đề này, với một câu trả lời cực kỳ kỹ lưỡng: stackoverflow.com/questions/27872069/NH Đây giống như một chuyến du lịch bí ẩn kéo dài ba giờ.
aliteralmind

8
Cũng đáng chú ý: trong Unix & Linux Stack Exchange, câu trả lời được chấp nhận cho Cách thêm dòng mới khi sử dụng echo
Graham Perrin

@GrahamPerrin, cảm ơn vì liên kết đến một câu trả lời rất hay và chi tiết thực sự! Tôi nghĩ nó tốt hơn những câu trả lời dưới đây.
Konstantin

2
echo -ne "hello \ nworld" (bạn cần cờ n để diễn giải các lối thoát) - nhưng như những người khác nói, các lệnh echo khác nhau có thể có kết quả khác nhau!
Konchog

Câu trả lời:


2878

Bạn có thể sử dụng printfthay thế:

printf "hello\nworld\n"

printfcó hành vi nhất quán hơn echo. Các hành vi echokhác nhau rất lớn giữa các phiên bản khác nhau.


49
hoặc thậm chí printf %"s\n" hello world- printf sẽ sử dụng lại định dạng nếu có quá nhiều đối số được đưa ra
glenn jackman

28
OP hỏi về echo, không printf; và câu trả lời của @ choroba bên dưới, sử dụng tùy chọn -e, điền vào hóa đơn một cách hoàn hảo.
JESii

57
@JESii: Nó phù hợp nếu bạn echotình cờ hỗ trợ -etùy chọn.
sth

11
Với một số phiên bản echo, -echỉ được in ở đầu ra nên tôi nghĩ câu trả lời này hoàn toàn hợp lệ vì echokhông nhất quán ở đây (trừ khi chúng ta đang nói về một phiên bản cụ thể).
Tejas Manohar

14
Điều này là tốt và tốt nếu printf có sẵn, nhưng không giống như echo đôi khi printf không có trên distro.
bigtunacan

1713

Bạn có chắc là bạn đang ở trong bash? Làm việc cho tôi, tất cả bốn cách:

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

368
-e cờ đã làm điều đó cho tôi, trong đó "cho phép giải thích các dấu gạch chéo ngược"
tandy

21
Tôi nghĩ rằng -eparam không tồn tại trên tất cả * nix OS
kenorb

12
@kenorb: Nó tồn tại trong bash. Nó là một nội dung.
choroba

Tại sao cái thứ ba hoạt động? Không có $, nó trả về "Hello n world"
Evan Donovan

21
Như được đề cập bởi nhiều người khác -e KHÔNG hoạt động cho tất cả các bản phân phối và phiên bản. Trong một số trường hợp, nó bị bỏ qua và trong những trường hợp khác, nó thực sự sẽ được in ra. Tôi không tin điều này đã sửa nó cho OP vì vậy không nên chấp nhận câu trả lời
csga5000

578
echo $'hello\nworld'

in

hello
world

$''chuỗi sử dụng trích dẫn ANSI C :

Từ ngữ của hình thức được đối xử đặc biệt. Từ này mở rộng thành chuỗi , với các ký tự thoát dấu gạch chéo ngược được thay thế theo quy định của tiêu chuẩn ANSI C.$'string'


15
@EvgeniSergeev Không chắc ý của bạn là gì, nhưng nó không có tác dụng với tôi trước. Và đó là bởi vì tôi đã sử dụng dấu ngoặc kép và hóa ra điều này chỉ hoạt động với dấu ngoặc đơn! Đã thử trong Terminal trên Mac.
trss

11
Các vấn đề với các biến trong chuỗi không được mở rộng.
willemdh

Bạn vẫn có thể nối chuỗi trích dẫn kép. `foo =" thanh "; echo $ '' $ foo'efoot'`
Kamafeather

141

Bạn luôn có thể làm echo "".

ví dụ

echo "Hello"
echo ""
echo "World"

6
echo ""làm việc cho tôi và tôi nghĩ đó là hình thức đơn giản nhất để in một dòng mới, ngay cả khi điều này không trực tiếp trả lời câu hỏi. Chúc mừng.
Mario Awad

2
Tôi nghĩ nó ít rõ ràng hơn (và do đó có khả năng gây nhầm lẫn hơn) echo -en "\n".
DBedrenko

72
echolà đủ để có được một dòng trống
ROMANIA_engineer

5
@Okneloper Hoạt động tốt cho tôi.
Matthew đọc

71

Thử

echo -e "hello\nworld"
hello
world

làm việc cho tôi trong nanobiên tập.

Từ trang người đàn ông:

-e cho phép giải thích các dấu gạch chéo ngược


41

Trong trường hợp có ai đó thấy mình đập đầu vào tường cố gắng tìm hiểu tại sao kịch bản của đồng nghiệp sẽ không in dòng mới, hãy tìm hiểu điều này ->

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

echo $(GET_RECORDS);

Như trong phần trên, hoạt động thực tế của phương thức có thể tự nó được bao bọc trong một tiếng vang thay thế cho bất kỳ tiếng vang nào có thể có trong chính phương thức đó. Rõ ràng là tôi đã tưới nó xuống cho ngắn gọn, nó không dễ để nhận ra!

Sau đó, bạn có thể thông báo cho các đồng chí của mình rằng một cách tốt hơn để thực thi các chức năng sẽ như vậy:

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

GET_RECORDS;

Hãy chắc chắn rằng bạn bọc biến bằng dấu ngoặc kép trước khi lặp lại phương thức đó.
ingyhere

23

Điều này làm việc cho tôi trong Raspbian,

echo -e "hello\\nworld"

2
Cũng hoạt động với tôi trong GitBash trên Windows 7 ;-)
Big Rich

3
Một dấu gạch chéo ngược là đủ
Felix D.

23

POSIX 7 về tiếng vang

http://pub.opengroup.org/onlinepub/9699919799/utilities/echo.html

-e không được xác định và dấu gạch chéo ngược được thực hiện được xác định:

Nếu toán hạng đầu tiên là -n hoặc nếu bất kỳ toán hạng nào chứa ký tự <backslash>, kết quả được xác định theo thực hiện.

trừ khi bạn có một phần mở rộng XSI tùy chọn.

Vì vậy, tôi khuyên bạn nên sử dụng printfthay thế, được chỉ định rõ:

toán hạng định dạng sẽ được sử dụng làm chuỗi định dạng được mô tả trong Ký hiệu định dạng tệp XBD [...]

các định dạng tập tin Notation :

\ n <newline> Di chuyển vị trí in sang đầu dòng tiếp theo.

Ngoài ra, hãy nhớ rằng Ubuntu 15.10 và hầu hết các bản phân phối đều triển khai echocả hai như:

  • một Bash tích hợp: help echo
  • một thực thi độc lập: which echo

có thể dẫn đến một số nhầm lẫn.


17

Đơn giản chỉ cần gõ

echo

để có được một dòng mới


3
Câu trả lời bị đánh giá rất thấp, không thể tin rằng câu hỏi này đã tích lũy được hơn 20 câu trả lời kể từ năm 2011 và không một câu hỏi nào trong số đó có giải pháp đơn giản này.
Prometheus

bí danh c = 'echo; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; tiếng vang; ' Đây là cách duy nhất tôi có thể xóa màn hình của mình, cảm ơn!
Ahi Tuna

@Ahi Tuna: Vui lòng sử dụng phím tắt bàn điều khiển của bạn thay vào đó :)
R Sun

@RSun và tôi sẽ làm điều đó như thế nào trên cửa sổ thiết bị đầu cuối Debian trên Chromebook?
Ahi Tuna

1
@AhiTuna rõ ràng; hoặc ctrl + l;
Hạt giống Mike

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

Đây thực sự là một câu trả lời tuyệt vời vì nó hoạt động cho nối chuỗi. Tuyệt quá!
LavaScornedOven

1
Tại sao phải gọi một chương trình thứ hai? Không phải là chúng tôi đang cố gắng viết một ứng dụng thời gian thực trong bash;) nhưng nó không cần thiết.
Felix D.

đây thực sự là một câu trả lời tuyệt vời nên hoạt động ở mọi nơi không có vấn đề gì. Bạn đã cứu người bạn hàng ngày của tôi @alinsoar
Kashyap Kotak

8

Nó hoạt động với tôi trong CentOS:

echo -e ""hello\nworld""

6

Bạn cũng có thể làm:

echo "hello
world"

Điều này hoạt động cả bên trong một tập lệnh và từ dòng lệnh.
Trong dòng lệnh, nhấn Shift+ Enterđể thực hiện ngắt dòng bên trong chuỗi.

Điều này hoạt động với tôi trên macOS và Ubuntu 18.04 của tôi


Làm thế nào để bạn gõ dòng ngắt mà không có shell để chạy lệnh khi bạn nhấn Ènter`?
Xenos

@Xenos Điều này hoạt động tốt trong một kịch bản. Và trong bảng điều khiển, chỉ cần nhấp vào Shift + Enter để thêm một dòng mới để tránh việc shell chạy lệnh chưa hoàn thành.
vinzee

5

Một mục nữa ở đây cho những người không làm cho nó hoạt động với bất kỳ giải pháp nào trong số này và cần nhận được giá trị trả về từ chức năng của họ:

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

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

Chỉ có mẹo này hoạt động trong một linux tôi đang làm việc với bash này:

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

Hy vọng nó sẽ giúp một người có vấn đề tương tự.


4

Kịch bản của tôi:

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

Đầu ra:

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

Trên kịch bản bash của tôi, tôi đã nổi điên như bạn cho đến khi tôi vừa thử:

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

Chỉ cần nhấn enter nơi bạn muốn chèn bước nhảy đó. Đầu ra bây giờ là:

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

4
Chỉ cần một lưu ý, có lẽ bạn sẽ muốn sử dụng $ {} xung quanh tên biến của mình vì không làm như vậy có thể dẫn đến hành vi thực sự kỳ lạ khi trình bao tìm thấy một biến có tên là $ warningsFound và in ra chứ không phải hai đầu ra riêng biệt.
dragon788

@ dragon788 có thể tôi đang thiếu một cái gì đó, nhưng biến IS thực sự được gọi là $ warningsFound?
psynnott

2
Tôi đã bỏ lỡ một từ về điều đó. Nếu bạn có một biến gọi là $ cảnh báo, trong một số trường hợp không sử dụng $ {warningsFound}, bạn có thể có khả năng kết thúc với nội dung của cảnh báo $ + "Tìm thấy" thay vì biến bạn dự định.
dragon788

3

Bạn cũng có thể sử dụng echo với niềng răng,

$ (echo hello; echo world)
hello
world

lỗi cú pháp gần mã thông báo bất ngờ `('khi được gọi trong tệp .sh
cosbor11

1
thửecho hello; echo world
Avinash Raj

1
Hoặc "echo hello && echo world" hoặc chỉ: "echo hello echo world
csga5000

3

Điều này có thể được thực hiện tốt hơn như là

x="\n"
echo -ne $x

Tùy chọn -e sẽ diễn giải các backslahes cho chuỗi thoát
tùy chọn -n sẽ loại bỏ dòng mới ở đầu ra

PS: echo lệnh có tác dụng luôn luôn bao gồm một dòng mới ở đầu ra vì vậy -n được yêu cầu tắt thứ đó (và làm cho nó bớt khó hiểu hơn)


echo -ne "hello \ nworld" cho câu trả lời chính xác của câu hỏi :)
Dhwanit

3

Có một mở rộng tham số mới được thêm vào trong đó diễn giải các chuỗi thoát:bash 4.4

${parameter@operator} - E operator

Việc mở rộng là một chuỗi là giá trị của tham số với các chuỗi thoát dấu gạch chéo ngược được mở rộng như với $'…'cơ chế trích dẫn.

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

2

Nếu bạn đang viết tập lệnh và sẽ lặp lại các dòng mới như một phần của các tin nhắn khác, một giải pháp đa nền tảng tốt là đặt một dòng mới theo nghĩa đen vào một biến như vậy:

newline='
'

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

0

Đôi khi bạn có thể truyền nhiều chuỗi cách nhau bởi một khoảng trắng và nó sẽ được hiểu là \n.

Ví dụ: khi sử dụng tập lệnh shell cho các thông báo nhiều dòng:

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

Điều này là không chính xác. Nó không bao giờ được giải thích là \n. Nó được hiểu là một đối số riêng biệt cho chương trình và chính chương trình có thể hiển thị đối số đó trên một dòng mới, nhưng điều đó không có nghĩa là nó được chuyển đổi thành \nbất kỳ lúc nào và hoàn toàn phụ thuộc vào chương trình.
Điểm_Under

0

Tôi đã phải bao quanh văn bản với dấu ngoặc kép trong khi sử dụng làm bí danh trong hồ sơ bash (MacOx, iTerm).

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

0

Điều này đã đưa tôi đến đó ....

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

Sản lượng:

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]

-1

Tôi chỉ sử dụng echo không có đối số

echo "Hello"
echo
echo "World"

-2

Giải pháp bổ sung:

Trong trường hợp, Bạn phải lặp lại nhiều nội dung dài (chẳng hạn như mã / cấu hình)

Ví dụ :

  • Một tập lệnh Bash để tạo mã / cấu hình

echo -e, printfcó thể có một số hạn chế

Bạn có thể sử dụng một số char đặc biệt làm trình giữ chỗ dưới dạng ngắt dòng (chẳng hạn như ~) và thay thế nó sau khi tệp được tạo bằng cách sử dụngtr

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

nó cần phải gọi một chương trình khác ( tr) sẽ tốt IMO.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.