หากฉันมีไฟล์input.txt
ที่มี:
hello
world
!
จากนั้นการดำเนินการคำสั่ง bash echo $(cat input.txt)
จะแสดงผลลัพธ์นี้:
hello world !
ทำไมและฉันจะแก้ไขมันเพื่อส่งออกสิ่งที่อยู่ในไฟล์ว่ามันเป็นอย่างไรในไฟล์?
หากฉันมีไฟล์input.txt
ที่มี:
hello
world
!
จากนั้นการดำเนินการคำสั่ง bash echo $(cat input.txt)
จะแสดงผลลัพธ์นี้:
hello world !
ทำไมและฉันจะแก้ไขมันเพื่อส่งออกสิ่งที่อยู่ในไฟล์ว่ามันเป็นอย่างไรในไฟล์?
คำตอบ:
ถ้าคุณใช้
echo "$(cat input.txt)"
มันจะทำงานอย่างถูกต้อง
อาจอินพุตของ echo ถูกคั่นด้วยการขึ้นบรรทัดใหม่และมันจะจัดการเป็นคำสั่งแยกดังนั้นผลลัพธ์จะไม่มีการขึ้นบรรทัดใหม่
echo "$(date) something"
การแยกบรรทัดใหม่ออกมาจากเอาท์พุทของวันที่ทำให้สะท้อนเอาท์พุทวันที่และ "บางสิ่งบางอย่าง" ในบรรทัดเดียวกัน หากคุณต้องการจัดเก็บไฟล์หรือเอาต์พุตคำสั่ง "ตามสภาพ" ให้ใช้ mapfile ( help mapfile
) read -rd ''
หรือ a-while แบบ read-loop
อ้างถึงจากหน้าคู่มือทุบตีส่วนCommand Substitution
:
บรรทัดใหม่ที่ฝังจะไม่ถูกลบ แต่อาจถูกลบระหว่างการแยกคำ
เพิ่มเติมเล็กน้อยในส่วนเดียวกัน:
หากการแทนที่ปรากฏภายในเครื่องหมายคำพูดคู่การแยกคำและการขยายชื่อพา ธ จะไม่ถูกดำเนินการกับผลลัพธ์
นั่นเป็นเหตุผลที่echo "$(cat /etc/passwd)"
ทำงาน
นอกจากนี้ควรทราบว่าการแทนที่คำสั่งนั้นด้วยข้อมูลจำเพาะ POSIXจะลบบรรทัดใหม่ที่ต่อท้าย:
$ echo "$(printf "one\ntwo\n\n\n")"
one
two
ดังนั้นการส่งออกไฟล์ผ่าน$(cat file.txt)
อาจทำให้สูญเสียการขึ้นบรรทัดใหม่และอาจเป็นปัญหาหากความสมบูรณ์ของไฟล์ทั้งหมดมีความสำคัญ
คุณสามารถเก็บบรรทัดใหม่ได้เช่นโดยการตั้งค่า IFS ให้ว่าง:
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3