ใน Bash ให้ลองสิ่งนี้:
echo -e "hello\nworld"
\n
แต่ก็ไม่ได้พิมพ์ขึ้นบรรทัดใหม่เท่านั้น ฉันจะทำให้มันพิมพ์บรรทัดใหม่ได้อย่างไร
ฉันใช้ Ubuntu 11.04
ใน Bash ให้ลองสิ่งนี้:
echo -e "hello\nworld"
\n
แต่ก็ไม่ได้พิมพ์ขึ้นบรรทัดใหม่เท่านั้น ฉันจะทำให้มันพิมพ์บรรทัดใหม่ได้อย่างไร
ฉันใช้ Ubuntu 11.04
คำตอบ:
คุณสามารถใช้printf
แทน:
printf "hello\nworld\n"
printf
echo
มีพฤติกรรมที่สอดคล้องกันมากขึ้นกว่า พฤติกรรมของecho
แตกต่างกันอย่างมากระหว่างรุ่นที่แตกต่างกัน
printf %"s\n" hello world
- printf จะนำรูปแบบมาใช้ซ้ำหากมีการโต้แย้งมากเกินไป
echo
เกิดขึ้นเพื่อสนับสนุน-e
ตัวเลือก
echo
, -e
ถูกพิมพ์เพียงในการส่งออกของตัวเองดังนั้นฉันคิดว่าคำตอบนี้เป็นที่ถูกต้องสมบูรณ์ตั้งแต่echo
ไม่สอดคล้องที่นี่ (ยกเว้นกรณีที่เรากำลังพูดถึงรุ่นที่เฉพาะเจาะจง)
คุณแน่ใจหรือว่าคุณกำลังทุบตี? ได้ผลสำหรับฉันทั้งสี่วิธี:
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
-e
พารามิเตอร์ไม่ได้อยู่ในทุก OS ระวัง *
echo $'hello\nworld'
พิมพ์
hello
world
$''
สตริงใช้ANSI C Quoting :
คำของแบบฟอร์มได้รับการปฏิบัติเป็นพิเศษ คำนี้ขยายออกเป็นสตริงด้วยอักขระเครื่องหมายทับขวาทับกลับแทนที่ตามที่ระบุโดยมาตรฐาน ANSI C
$'string'
echo ""
คุณก็สามารถทำ
เช่น
echo "Hello"
echo ""
echo "World"
echo ""
เหมาะกับฉันและฉันคิดว่ามันเป็นรูปแบบที่ง่ายที่สุดในการพิมพ์บรรทัดใหม่แม้ว่านี่จะไม่ตอบคำถามโดยตรงก็ตาม ไชโย
echo -en "\n"
(และอาจทำให้เกิดความสับสนมากขึ้นกว่า)
echo
ก็เพียงพอที่จะรับบรรทัดว่าง
ลอง
echo -e "hello\nworld"
hello
world
ทำงานให้ฉันในการnano
แก้ไข
จากหน้าคน:
-e
เปิดใช้การตีความเครื่องหมายแบคสแลช
ในโอกาสที่มีคนพบว่าตัวเองกำลังตีหัวชนกำแพงพยายามคิดว่าทำไมสคริปต์ของเพื่อนร่วมงานจะไม่พิมพ์บรรทัดใหม่ให้ระวังเรื่องนี้ ->
#!/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;
POSIX 7 บนเสียงสะท้อน
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
ไม่ได้ถูกกำหนดและแบ็กสแลชเป็นการใช้งานที่กำหนดไว้:
หากตัวถูกดำเนินการแรกคือ -n หรือถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งมีอักขระ <backslash> ผลลัพธ์จะถูกกำหนดโดยการนำไปใช้งาน
ยกเว้นว่าคุณมีนามสกุล XSI ซึ่งเป็นตัวเลือก
ดังนั้นฉันขอแนะนำให้คุณใช้printf
แทนซึ่งระบุไว้อย่างดี:
ตัวถูกดำเนินการรูปแบบจะต้องใช้เป็นสตริงรูปแบบที่อธิบายไว้ในสัญกรณ์รูปแบบไฟล์ XBD [... ]
\ n <newline> ย้ายตำแหน่งการพิมพ์ไปที่จุดเริ่มต้นของบรรทัดถัดไป
พึงระลึกไว้เสมอว่า Ubuntu 15.10 และ distros ส่วนใหญ่ใช้งานecho
ทั้งสองอย่างดังนี้:
help echo
which echo
ซึ่งอาจนำไปสู่ความสับสน
เพียงพิมพ์
echo
เพื่อรับบรรทัดใหม่
str='hello\nworld'
$ echo | sed "i$str"
hello
world
มันเหมาะกับฉันใน CentOS:
echo -e ""hello\nworld""
คุณยังสามารถทำสิ่งต่อไปนี้
echo "hello
world"
สิ่งนี้ใช้ได้ทั้งในสคริปต์และจากบรรทัดคำสั่ง
ในบรรทัดคำสั่งกดShift+ Enterเพื่อทำการแบ่งบรรทัดภายในสตริง
สิ่งนี้ใช้ได้กับฉันใน macOS และ Ubuntu 18.04 ของฉัน
อีกหนึ่งรายการที่นี่สำหรับผู้ที่ไม่ได้ทำงานกับโซลูชั่นเหล่านี้และต้องการรับค่าตอบแทนจากการทำงาน:
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)
หวังว่าจะช่วยคนที่มีปัญหาคล้ายกัน
สคริปต์ของฉัน:
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:
คุณสามารถใช้เสียงก้องด้วยเครื่องหมายปีกกา
$ (echo hello; echo world)
hello
world
echo hello; echo world
สิ่งนี้น่าจะดีกว่า
x="\n"
echo -ne $x
ตัวเลือก e- จะตีความ backslahes สำหรับลำดับหนี
ตัวเลือก -n จะลบขึ้นบรรทัดใหม่ในการส่งออก
PS: คำสั่ง echo มีผลกระทบเสมอรวมถึงบรรทัดใหม่ต่อท้ายในเอาต์พุตดังนั้น -n จำเป็นต้องปิดสิ่งนั้น (และทำให้สับสนน้อยลง)
มีการขยายพารามิเตอร์ใหม่ที่ เพิ่มในการตีความลำดับหนี:bash 4.4
${parameter@operator} - E operator
การขยายตัวเป็นสตริงที่เป็นค่าของพารามิเตอร์ที่มีลำดับ backslash escape ขยายเช่นเดียวกับ
$'…'
กลไกการอ้างอิง
$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
หากคุณกำลังเขียนสคริปต์และจะขึ้นบรรทัดใหม่เป็นส่วนหนึ่งของข้อความอื่น ๆ หลายครั้งโซลูชันข้ามแพลตฟอร์มที่ดีคือการวางบรรทัดใหม่ตามตัวอักษรในตัวแปรดังนี้:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
\n
บางครั้งคุณสามารถส่งผ่านสายหลายคั่นด้วยช่องว่างและมันจะถูกตีความว่าเป็น
ตัวอย่างเช่นเมื่อใช้เชลล์สคริปต์สำหรับการแจ้งเตือนแบบหลายบรรทัด:
#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
\n
มันเป็นเรื่องที่ไม่เคยตีความว่าเป็น มันถูกตีความว่าเป็นอาร์กิวเมนต์แยกต่างหากกับโปรแกรมและตัวโปรแกรมเองอาจแสดงอาร์กิวเมนต์นั้นในบรรทัดใหม่ แต่นั่นไม่ได้หมายความว่ามันถูกแปลงเป็น\n
จุดใด ๆ และขึ้นอยู่กับโปรแกรมทั้งหมด
ฉันต้องล้อมรอบข้อความด้วยอัญประกาศคู่ในขณะที่ใช้เป็นนามแฝงในโปรไฟล์ทุบตี (MacOx, iTerm)
alias helloworld="echo -e \"hello \n world\""
นี่ทำให้ฉันมี ....
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]
ฉันแค่ใช้ echo no ขัดแย้ง
echo "Hello"
echo
echo "World"
ทางออกเพิ่มเติม:
ในกรณีที่คุณต้อง echo หลายเนื้อหายาว (เช่นรหัส / การกำหนดค่า)
ตัวอย่างเช่น :
echo -e
,
printf
อาจมีข้อ จำกัด บางอย่าง
คุณสามารถใช้อักขระพิเศษบางอย่างเป็นตัวยึดตำแหน่งเป็นตัวแบ่งบรรทัด (เช่น~
) และแทนที่หลังจากสร้างไฟล์โดยใช้tr
echo ${content} | tr '~' '\n' > $targetFile
จำเป็นต้องเรียกใช้โปรแกรมอื่น ( tr
) ซึ่งควรเป็น IMO ที่ใช้ได้