บทความนี้จะแสดงวิธีใช้ Heredoc (Here Document) ในสคริปต์ Bash/Shell เพื่อทำงานกับข้อความหลายบรรทัด
Heredoc มีประโยชน์มากสำหรับการรับอินพุตหลายบรรทัด – ผู้ใช้สามารถป้อนบรรทัดข้อความ กด Enter แล้วป้อนบรรทัดถัดไป ต่อไปเรื่อยๆ มันยังสามารถใช้กำหนดข้อความหลายบรรทัดในสคริปต์ได้อีกด้วย
มันยังสามารถส่งคำสั่งหลายคำสั่งเข้าไปในโปรแกรมโต้ตอบได้ – จะแสดงในตัวอย่างภายหลัง
ตัวอย่างในบทความนี้จะทำงานได้ใน Bash และ Zsh Shells ทั้งคู่
Standard Input, Piping, และ Redirection
Heredoc มักใช้กับ Standard Input/Output และ redirection/piping เพื่อส่งข้อความหลายบรรทัดไปยังคำสั่งอื่นๆ เพื่อประมวลผล จัดรูปแบบ หรือแสดงผล หัวข้อนี้ต้องการบทความแยกต่างหากเพื่ออธิบายแนวคิด ดังนั้น вот nó:
Redirect stdin, stdout, stderr in Linux/Bash, With Examples
ตัวอย่างด้านล่างจะใช้แนวคิดและวิธีการที่ครอบคลุมในบทความข้างต้นหลายจุด
ไวยากรณ์ Heredoc ของ Bash/Zsh
เพื่อเริ่ม Heredoc คุณเพียงแค่ใช้คำสั่ง << นี่เป็นรูปแบบหนึ่งของการเปลี่ยนทิศทาง Input/Output ที่ระบุไว้ข้างต้น
ไวยากรณ์สำหรับการใช้ Heredoc มีดังนี้:
COMMAND <<LIMITSTRING text line 1 text line 2 ... LIMITSTRING
โปรดสังเกตว่า:
- COMMAND สามารถเป็นคำสั่ง Linux หรือสคริปต์ใดๆ – เนื้อหาข้อความใน heredoc จะถูกส่งไปยังมันโดยใช้ redirection
- << กำหนดจุดเริ่มต้นของคำสั่ง Heredoc
- หากคุณจะเยื้องข้อความหลายบรรทัด ให้ใช้ <<- (สังเกตเครื่องหมายขีดเพิ่ม) แทน – มันจะตัดแท็บนำหน้าออกจากแต่ละบรรทัด
- LIMITSTRING คือสตริงที่ต้องพิมพ์เพื่อจบการป้อนข้อความสำหรับ Heredoc
- เนื่องจาก Heredocs เป็นหลายบรรทัด โดยผู้ใช้กดปุ่ม ENTER เพื่อไปบรรทัดใหม่ คุณจึงไม่สามารถกด Enter เพื่อหยุดการป้อนข้อความใหม่ได้
- LIMITSTRING เมื่อปรากฏขึ้น จะบอก Heredoc ว่าคุณป้อนข้อความเสร็จแล้วและให้เสร็จสิ้น
- มันสามารถเป็นอะไรก็ได้ – ตรวจสอบให้แน่ใจว่าคุณใช้ชุดตัวอักษรที่ไม่จำเป็นต้องปรากฏในข้อความของคุณ เพื่อไม่ให้จบก่อนวาน
- แนวปฏิบัติทั่วไปคือใช้ข้อความ EOF (ย่อมาจาก End Of File) เป็น LIMITSTRING – ตราบใดที่ข้อความนี้ไม่ได้ปรากฏภายใน Heredoc
- คุณสามารถมีบรรทัดข้อความได้ไม่จำกัด
ตัวอย่าง Heredoc
รับอินพุตข้อความหลายบรรทัด
ตัวอย่างนี้จะรับหลายบรรทัดของข้อความและส่งไปยังคำสั่ง cat เพื่อแสดง:
cat <<EOF This is line 1 This is line 2 EOF
ตัวอย่างข้างต้นควรพิมพ์ในโปรแกรมเทอร์มินัลของคุณ
ใช้ตัวแปร
คุณสามารถใช้ตัวแปร Shell ใน 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
ข้างต้น cat อ่านเนื้อหาของ Heredoc และเอาต์พุตของ cat ถูกเปลี่ยนทิศทางและเขียนไปยังไฟล์ output.txt โดยใช้คำสั่ง >
กำหนดข้อความหลายบรรทัดในสคริปต์
คุณสามารถใช้ Heredoc ในสคริปต์ได้ เนื่องจากสคริปต์ Shell เป็นเพียงรายการคำสั่งทีละบรรทัดที่จะป้อนเข้า Shell มันจะทำงานเหมือนกัน
มันดีที่จะสามารถเยื้องโค้ดสคริปต์ของคุณได้ – หากคุณไม่ต้องการให้แท็บเหล่านั้นปรากฏในข้อความ คุณสามารถเพิ่ม – (ขีด) ในการประกาศ 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 ยังสามารถส่งหลายบรรทัดของข้อความไปยังโปรแกรมโต้ตอบได้ โปรแกรมบางโปรแกรม เมื่อเปิดใช้งานและเชื่อมต่อกับเซิร์ฟเวอร์แล้ว คุณสามารถพิมพ์คำสั่งของคุณเองได้ – พวกเขาอาจยอมรับข้อความเพื่อประมวลผล หรือให้ Shell ของตัวเองสำหรับการออกคำสั่ง
ตัวอย่างหนึ่งคือ MySQL – เมื่อ MySQL เปิดใช้งานและเชื่อมต่อกับเซิร์ฟเวอร์แล้ว คุณสามารถพิมพ์คำสั่งของคุณเองตามด้วยปุ่ม Enter เพื่อสืบค้นข้อมูล ด้วยการใช้ Heredoc คุณสามารถเขียนคำสั่งเหล่านี้ล่วงหน้าและส่งเข้า MySQL โดยไม่ต้องโต้ตอบกับผู้ใช้:
mysql -uUSERNAME -pPASSWORD DATABASE <<EOF SHOW TABLES; SELECT * FROM posts; EOF
ข้างต้น คำสั่ง MySQL ใช้เชื่อมต่อกับ DATABASE ที่กำหนดพร้อม USERNAME และ PASSWORD
คำสั่งลำดับสองคำสั่งจะถูกออกเมื่อพร้อมเชื่อมต่อ – คำสั่งหนึ่งเพื่อ SHOW TABLES และอีกคำสั่งเพื่อ SELECT ทุกรายการจากตาราง posts