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.
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.
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
. Các hành vi echo
khác nhau rất lớn giữa các phiên bản khác nhau.
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
echo
tình cờ hỗ trợ -e
tùy chọn.
echo
, -e
chỉ được in ở đầu ra nên tôi nghĩ câu trả lời này 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ể).
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
-e
param không tồn tại trên tất cả * nix OS
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'
Bạn luôn có thể làm echo ""
.
ví dụ
echo "Hello"
echo ""
echo "World"
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.
echo -en "\n"
.
echo
là đủ để có được một dòng trống
Thử
echo -e "hello\nworld"
hello
world
làm việc cho tôi trong nano
biê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
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;
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 printf
thay 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 echo
cả hai như:
help echo
which echo
có thể dẫn đến một số nhầm lẫn.
Đơn giản chỉ cần gõ
echo
để có được một dòng mới
str='hello\nworld'
$ echo | sed "i$str"
hello
world
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
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ự.
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:
Bạn cũng có thể sử dụng echo với niềng răng,
$ (echo hello; echo world)
hello
world
echo hello; echo world
Đ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)
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
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
Đô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"`
\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 \n
bất kỳ lúc nào và hoàn toàn phụ thuộc vào chương trình.
Đ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]
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ụ :
echo -e
,
printf
có 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.