Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เรียนรู้ Heredoc (Here Documents) ใน Bash & Linux Shells – บทช่วยสอนฉบับสมบูรณ์

บทความนี้จะแสดงวิธีใช้ 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