บทความนี้จะแสดงวิธีใช้ Heredoc (เอกสารที่นี่ ) ในสคริปต์ Bash/Shell เพื่อทำงานกับข้อความหลายบรรทัด
Heredocs มีประโยชน์มากที่สุดสำหรับการรับอินพุตแบบหลายบรรทัด ผู้ใช้สามารถป้อนบรรทัดข้อความ กด Enter จากนั้นป้อนบรรทัดถัดไป เป็นต้น นอกจากนี้ยังใช้เพื่อกำหนดข้อความหลายบรรทัดในสคริปต์ได้อีกด้วย
นอกจากนี้ยังส่งหลายคำสั่งไปยังโปรแกรมแบบโต้ตอบได้ ซึ่งจะแสดงในตัวอย่างในภายหลัง
ตัวอย่างในบทความนี้ใช้ได้กับทั้ง Bash และ Zsh Shells
อินพุตมาตรฐาน การวางท่อ และการเปลี่ยนเส้นทาง
Heredoc มักใช้กับอินพุต/เอาต์พุตมาตรฐาน และการเปลี่ยนเส้นทาง/การวางท่อเพื่อส่งข้อความหลายบรรทัดไปยังคำสั่งอื่นๆ สำหรับการประมวลผล การจัดรูปแบบ หรือการแสดงผล หัวข้อนี้จำเป็นต้องมีบทความเพื่ออธิบายแนวคิด ดังนั้นนี่คือ:
เปลี่ยนเส้นทาง stdin, stdout, stderr ใน Linux/Bash พร้อมตัวอย่าง
ตัวอย่างด้านล่างจะใช้แนวคิดและวิธีการที่กล่าวถึงในบทความด้านบนในหลายประเด็น
Bash/Zsh Heredoc ไวยากรณ์
วิธีเริ่มต้น Heredoc คุณเพียงแค่ใช้ << สั่งการ. นี่คือรูปแบบหนึ่งของการเปลี่ยนเส้นทางอินพุต/เอาท์พุตที่ระบุไว้ด้านบน
ไวยากรณ์สำหรับการใช้ Heredoc เป็นดังนี้:
COMMAND <<LIMITSTRING text line 1 text line 2 ... LIMITSTRING
โปรดทราบว่า:
- คำสั่ง สามารถเป็นคำสั่งหรือสคริปต์ของ Linux ได้ – เนื้อหาของข้อความที่อยู่ในเอกสารนี้จะถูกส่งไปโดยใช้ redirection
- << กำหนดจุดเริ่มต้นของคำสั่ง Heredoc
- หากคุณจะเยื้องข้อความหลายบรรทัด ให้ใช้ <<- (สังเกตเครื่องหมายขีดที่เพิ่ม) แทน – จะดึงแท็บนำหน้าออกจากแต่ละบรรทัด
- LIMITSTRING เป็นสตริงที่ต้องพิมพ์เพื่อสิ้นสุดการป้อนข้อความสำหรับ Heredoc
- เนื่องจาก Heredocs เป็นแบบหลายบรรทัด โดยที่ผู้ใช้กดปุ่ม ENTER เพื่อเลื่อนไปยังบรรทัดถัดไป คุณจะไม่สามารถกด Enter เพื่อหยุดป้อนข้อความใหม่ได้
- LIMITSTRING ในลักษณะที่ปรากฏ บอก Heredoc ว่าคุณป้อนข้อความเสร็จแล้วและดำเนินการให้เสร็จสิ้น
- เป็นอะไรก็ได้ – ตรวจสอบให้แน่ใจว่าคุณใช้ชุดอักขระที่ไม่ต้องการให้ปรากฏในข้อความเพื่อไม่ให้สิ้นสุดก่อนเวลาอันควร
- แนวทางปฏิบัติทั่วไปคือการใช้ข้อความ EOF (ย่อมาจาก E น O ฉ ฉ ile) เป็น LIMITSTRING – ตราบใดที่ข้อความนี้จะไม่ปรากฏใน Heredoc
- คุณสามารถมีข้อความได้มากเท่าที่คุณต้องการ
ตัวอย่าง Heredoc
ยอมรับการป้อนข้อความหลายบรรทัด
ตัวอย่างนี้จะยอมรับข้อความหลายบรรทัดและส่งไปยัง cat คำสั่งสำหรับแสดงผล:
cat <<EOF This is line 1 This is line 2 EOF
ควรพิมพ์ตัวอย่างข้างต้นลงในโปรแกรมเทอร์มินัลของคุณ
การใช้ตัวแปร
คุณสามารถใช้ตัวแปรเชลล์ใน Heredoc ของคุณ:
cat <<EOF This is line 1 This is line 2 Your current directory is $PWD EOF
ด้านบน ตัวแปร $PWD จะแสดงในบรรทัดใดบรรทัดหนึ่งของ Heredoc ซึ่งตัวแปรนี้จะเก็บค่าของไดเรกทอรีการทำงานปัจจุบันไว้
เปลี่ยนเส้นทางเอาต์พุตของ Heredoc
การเปลี่ยนเส้นทางมาตรฐาน (ดูก่อนหน้าในบทความหากคุณไม่รู้ว่านี่คืออะไร) สามารถใช้เพื่อส่งเนื้อหาของ Heredoc หลังจากที่ถูกส่งไปยัง COMMAND ไปยังโปรแกรมหรือไฟล์อื่น:
cat <<EOF > output.txt This is line 1 This is line 2 Your current directory is $PWD EOF
ข้างบน แมว อ่านเนื้อหาของ Heredoc และผลลัพธ์ของ cat ถูกเปลี่ยนเส้นทางและเขียนไปยังไฟล์ output.txt โดยใช้ > คำสั่ง
การกำหนดข้อความหลายบรรทัดในสคริปต์
คุณสามารถใช้ Heredoc ในสคริปต์ได้ เนื่องจากเชลล์สคริปต์เป็นเพียงรายการคำสั่งแบบบรรทัดต่อบรรทัดที่จะป้อนลงในเชลล์ มันจึงทำงานในลักษณะเดียวกัน
เป็นการดีที่จะเยื้องโค้ดสคริปต์ของคุณ หากคุณไม่ต้องการให้แท็บเหล่านั้นปรากฏในข้อความของคุณ คุณสามารถเพิ่ม – (เส้นประ) กับคำสั่ง Heredoc ของคุณเพื่อตัดช่องว่างสีขาวออกจากจุดเริ่มต้นของแต่ละบรรทัด:
#!/bin/bash if $trueOrFalse; then cat <<-EOF > output.txt This is line 1 This is line 2 Your current directory is $PWD EOF fi #!/bin/bash
การกำหนด Heredoc ให้กับตัวแปร
คุณกำหนดข้อความหลายบรรทัดใน Heredoc ให้กับตัวแปรสคริปต์ได้โดยการอ่านด้วย cat คำสั่งและกำหนดเอาต์พุตให้กับตัวแปรดังนี้:
mytext=$(cat <<-EOF This is line 1 This is line 2 Your current directory is $PWD EOF ) echo $mytext
การส่งคำสั่งหลายคำสั่งไปยังโปรแกรมแบบโต้ตอบ
Heredocs ยังสามารถส่งข้อความหลายบรรทัดไปยังโปรแกรมแบบโต้ตอบได้ เมื่อเปิดใช้แล้ว บางโปรแกรมคาดหวังให้คุณพิมพ์คำสั่งของคุณเอง โปรแกรมเหล่านั้นอาจยอมรับข้อความสำหรับการประมวลผลหรือจัดเตรียมเชลล์ของตนเองสำหรับการออกคำสั่ง
ตัวอย่างหนึ่งคือ MySQL – เมื่อ MySQL เปิดตัวและเชื่อมต่อกับเซิร์ฟเวอร์แล้ว คุณสามารถพิมพ์คำสั่งของคุณเองตามด้วยคีย์ Enter เพื่อสืบค้นข้อมูล ด้วยการใช้ Heredoc คุณสามารถให้คำสั่งเหล่านี้เขียนไว้ล่วงหน้าและส่งไปยัง MySQL โดยไม่ต้องโต้ตอบกับผู้ใช้:
mysql -uUSERNAME -pPASSWORD DATABASE <<EOF SHOW TABLES; SELECT * FROM posts; EOF
ด้านบน MySQL คำสั่งใช้เพื่อเชื่อมต่อกับฐานข้อมูลที่กำหนดด้วย USERNAME และ PASSWORD
จากนั้นจะออกคำสั่งตามลำดับสองคำสั่งเมื่อการเชื่อมต่อพร้อม – คำสั่งหนึ่งเป็น SHOW TABLES และอีกอันเพื่อ เลือก บันทึกทั้งหมดจาก โพสต์ ตาราง