Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

HEREDOC (เอกสารที่นี่) ใน Bash และ Linux Shell - บทช่วยสอน

บทความนี้จะแสดงวิธีใช้ 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 และอีกอันเพื่อ เลือก บันทึกทั้งหมดจาก โพสต์ ตาราง