การมอบหมายงานไม่ได้ลบอักขระขึ้นบรรทัดใหม่ แต่เป็นการechoทำเช่นนี้ คุณต้องใส่เครื่องหมายคำพูดรอบ ๆ สตริงเพื่อรักษาบรรทัดใหม่เหล่านั้น:
echo "$testvar"
สิ่งนี้จะให้ผลลัพธ์ที่คุณต้องการ ดูการถอดเสียงต่อไปนี้สำหรับการสาธิต:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
เหตุผลว่าทำไมการขึ้นบรรทัดใหม่จะถูกแทนที่ด้วยช่องว่างที่ไม่ได้ทั้งหมดจะทำอย่างไรกับechoคำสั่งค่อนข้างจะเป็นรวมกันของสิ่ง
เมื่อกำหนดบรรทัดคำสั่งให้bashแยกออกเป็นคำตามเอกสารสำหรับIFSตัวแปร:
ไอเอฟเอ:ภายในสนามแยกที่ใช้สำหรับการแยกคำหลังจากที่ขยายตัว ... <space><tab><newline>ค่าเริ่มต้นคือ
ซึ่งระบุว่าโดยค่าเริ่มต้นสามารถใช้อักขระสามตัวใดก็ได้ในการแบ่งคำสั่งของคุณออกเป็นแต่ละคำ หลังจากนั้นตัวคั่นคำจะหายไปสิ่งที่คุณเหลือคือรายการคำ
รวมเข้ากับechoเอกสาร ( bashคำสั่งภายใน) แล้วคุณจะเห็นว่าเหตุใดจึงมีช่องว่างออกมา:
echo [-neE] [arg ... ]:ส่งออก args คั่นด้วยช่องว่างตามด้วยขึ้นบรรทัดใหม่
เมื่อคุณใช้echo "$x"จะบังคับให้xตัวแปรทั้งหมดเป็นคำเดียวตามbashดังนั้นจึงไม่แยก คุณสามารถดูได้ด้วย:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
ที่นี่countฟังก์ชันจะพิมพ์จำนวนอาร์กิวเมนต์ที่ระบุ 1 2 3และa b c dสายพันธุ์ที่แสดงให้เห็นในการกระทำ
แล้วเราลองกับทั้งสองรูปแบบในxตัวแปร หนึ่งโดยไม่ต้องคำพูดที่แสดงให้เห็นว่ามีสี่คำ"test", "1", และ"test" "2"เพิ่มคำพูดที่ทำให้มันเป็นหนึ่งใน"test 1\ntest 2"คำเดียว