Câu hỏi Echo newline in Bash in chữ \ n


Trong Bash, hãy 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.


1579
2017-12-11 21:01


gốc


Đối với những người nói "nó làm việc cho 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ư là 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 kỳ điều gì không thuận lợi, hãy sử dụng printf thay thế (như trong câu trả lời của @ sth). - Gordon Davisson
tôi không hiểu bất kì các đề xuất trong câu trả lời này có hiệu quả, 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 điệp echo (và printf) trong hàm được thêm vào giá trị trả về sau khi bị tước các dòng mới. Đây là một câu hỏi liên quan đến điều này, với một câu trả lời cực kỳ kỹ lưỡng: stackoverflow.com/questions/27872069/… Điều này giống như một tour du lịch bí ẩn ba giờ. - aliteralmind
Cũng đáng chú ý: trong Unix & Linux Stack Exchange, câu trả lời được chấp nhận đến Cách thêm dòng mới khi sử dụng echo - Graham Perrin
@ GrahamPerrin, cảm ơn cho các liên kết đến một câu trả lời rất tốt và chi tiết thực sự! Tôi nghĩ nó tốt hơn câu trả lời dưới đây. - Konstantin
echo -ne "hello \ nworld" (bạn cần cờ n để giải thích thoát) - nhưng như những người khác nói, các lệnh echo khác nhau có thể có các kết quả khác nhau! - Konchog


Các câu trả lời:


Bạn đã có thể sử dụng printf thay thế:

printf "hello\nworld\n"

printf có hành vi nhất quán hơn echo. Hành vi của echo thay đổi rất nhiều giữa các phiên bản khác nhau.


1946
2017-12-11 21:04



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ố - glenn jackman
OP hỏi về echo, không phải 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
@ JESii: Nó phù hợp nếu bạn echo xảy ra để hỗ trợ -e Tùy chọn. - sth
Với một số phiên bản echo, -e chỉ được in ở đầu ra vì vậy tôi nghĩ câu trả lời này là hoàn toàn hợp lệ vì echo khô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
Đ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 phải là trên distro. - bigtunacan


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

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

1302
2017-12-11 21:04



-e flag đã làm nó cho tôi, mà "cho phép giải thích thoát khỏi dấu gạch chéo ngược" - tandy
Tôi nghĩ -e param không tồn tại trên tất cả hệ điều hành * nix - kenorb
@kenorb: Nó tồn tại trong bash. Nó là một nội trang. - choroba
Tại sao cái thứ ba lại hoạt động? Không có $ nó trả về "Hello n world" - Evan Donovan
Như đã đề cập bởi nhiều-khác không làm việc 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 một số trường hợp khác nó sẽ được in ra. Tôi không tin rằng điều này cố định nó cho OP nên không được chấp nhận câu trả lời - csga5000


echo $'hello\nworld'

bản in

hello
world

$'' dây sử dụng Trích dẫn ANSI C:

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


424
2017-11-02 09:39



Thực hiện điều này không phải làm việc cho ai? Hãy cho chúng tôi biết. - Evgeni Sergeev
@EvgeniSergeev Không chắc chắn những gì bạn có ý nghĩa, nhưng nó đã không làm việc cho tôi hoặc là đầu tiên. Và đó là bởi vì tôi đã sử dụng dấu nháy kép và hóa ra tác phẩm này chỉ với dấu nháy đơn! Đã thử trong Terminal trên Mac. - trss
Các vấn đề với các biến trong chuỗi không được mở rộng. - willemdh


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

ví dụ.

echo "Hello"
echo ""
echo "World"

90
2018-02-28 22:14



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
Tôi nghĩ rằng 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
echo là đủ để có được một dòng sản phẩm nào - ROMANIA_engineer
echo '' không làm việc btw - Okneloper
@Okneloper Hoạt động tốt cho tôi. - Matthew Read


Trong cơ hội mà một người nào đó thấy mình đập đầu vào tường cố gắng tìm ra lý do tại sao một 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ư ở trên, việc chạy thực tế của phương thức này có thể được bao bọc trong một tiếng vang, nó thay thế cho bất kỳ tiếng vang nào có thể có trong chính phương thức đó. Rõ ràng tôi đã tưới nước này xuống cho ngắn gọn, nó không phải là dễ dàng như vậy để phát hiện!

Sau đó, bạn có thể thông báo cho các đồng chí của mình rằng cách tốt hơn để thực hiện các hàm sẽ như sau:

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

GET_RECORDS;

33
2017-08-08 20:15



Hãy chắc chắn rằng bạn quấn biến với dấu ngoặc kép trước khi lặp lại nó ra khỏi phương pháp. - ingyhere


Thử

echo -e "hello\nworld"
hello
world

đã làm việc cho tôi trong trình soạn thảo nano.


22
2017-12-05 11:06





Điều này làm việc cho tôi bằng raspbian,

echo -e "hello\\nworld"


18
2018-04-19 19:05



Làm việc cho tôi trong GitBash trên Windows 7, quá ;-) - Big Rich
Một dấu gạch chéo ngược duy nhất là đủ - Felix D.
Trừ một để lặp lại câu trả lời đã tồn tại. - Piotr Dobrogost


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

14
2017-11-23 11:10



Đây thực sự là một câu trả lời tuyệt vời vì nó hoạt động đối với các chuỗi nối. Tuyệt quá! - LavaScornedOven
Tại sao phải gọi một chương trình thứ hai? Nó 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 mà nên làm việc ở khắp mọi nơi không có vấn đề gì. Bạn đã cứu người bạn của tôi @alinsoar - Kashyap Kotak


POSIX 7 trên echo

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

-e không được xác định và các 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ả sẽ được xác định thực hiện.

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

Vì vậy, sử dụng printf thay thế:

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

các Ký hiệu Định dạng Tệp:

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

Cũng nên nhớ rằng Ubuntu 15.10 và hầu hết các distro thực hiện echo cả hai như:

  • Bash được xây dựng trong: help echo
  • một tệp thực thi độc lập: which echo

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


14
2018-01-22 13:23





Một mục khác ở đâ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 có một giá trị trả lại từ hàm của chúng:

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

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

Chỉ lừa này làm việc trong một linux tôi đã làm việc trên 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 ai đó với vấn đề tương tự.


4
2018-01-31 14:20





Tập lệnh 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 giận như bạn cho đến khi tôi vừa thử:

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

Chỉ cần nhấn vào 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:

3
2018-05-14 08:58



Chỉ cần một lưu ý, có thể bạn sẽ muốn sử dụng $ {} quanh các tên biến của bạn vì không làm như vậy có thể dẫn đến hành vi thực sự kỳ lạ khi một shell tìm thấy một biến gọi là $ warningsFound và in đó chứ không phải hai đầu ra riêng biệt. - dragon788
@ dragon788 có lẽ tôi đang thiếu một cái gì đó, nhưng biến IS thực sự được gọi là $ warningsFound? - psynnott
Tôi đã bỏ lỡ một từ về điều đó. Nếu bạn có một biến gọi là $ warnings, trong một số trường hợp không sử dụng $ {warningsFound}, bạn có khả năng kết thúc với nội dung của $ warnings + "Found" thay vì biến bạn dự định. - dragon788