การมอบหมายงานไม่ได้ลบอักขระขึ้นบรรทัดใหม่ แต่เป็นการ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"
คำเดียว