เอกสารที่นี่ (Heredoc ) เป็นอินพุตหรือสตรีมไฟล์ตามตัวอักษรที่ถือว่าเป็นบล็อกพิเศษของโค้ด บล็อกของรหัสนี้จะถูกส่งไปยังคำสั่งสำหรับการประมวลผล Heredoc มีต้นกำเนิดใน UNIX เชลล์และสามารถพบได้ในเชลล์ Linux ยอดนิยมเช่น sh, tcsh, ksh, bash, zsh, csh โดยเฉพาะภาษาโปรแกรมอื่นๆ เช่น Perl, Ruby, PHP ยังรองรับ heredoc
โครงสร้างของเฮอร์ด็อก
Heredoc ใช้วงเล็บ 2 มุม (<<) ตามด้วย โทเค็นตัวคั่น . โทเค็นตัวคั่นเดียวกันจะใช้เพื่อยุติบล็อกของรหัส อะไรก็ตามที่อยู่ภายในตัวคั่นถือเป็นบล็อกของรหัส
ดูตัวอย่างด้านล่าง ฉันกำลังเปลี่ยนเส้นทางบล็อกของรหัสไปยังคำสั่ง cat ที่นี่ตัวคั่นถูกตั้งค่าเป็น “BLOCK ” และจบลงด้วย “BLOCK . เดียวกัน” “.
cat << BLOCK
Hello world
Today date is $(date +%F)
My home directory = ${HOME}
BLOCK
หมายเหตุ :คุณควรใช้โทเค็นตัวคั่นเดียวกันเพื่อเริ่มบล็อกและยุติการบล็อก
สร้างความคิดเห็นหลายบรรทัด
หากคุณกำลังเขียนโค้ดเป็น bash อยู่ คุณอาจรู้ว่าโดยค่าเริ่มต้น bash ไม่สนับสนุนความคิดเห็นแบบหลายบรรทัด เช่น C หรือ Java . คุณสามารถใช้ HereDoc เพื่อเอาชนะสิ่งนี้
นี่ไม่ใช่คุณสมบัติในตัวของ bash ที่รองรับความคิดเห็นหลายบรรทัด แต่เป็นเพียงการแฮ็ก หากคุณไม่ได้เปลี่ยนเส้นทาง heredoc สำหรับคำสั่งใดๆ ล่ามจะอ่านบล็อคของโค้ดและจะไม่ดำเนินการใดๆ
<< COMMENT This is comment line 1 This is comment line 2 This is comment line 3 COMMENT
การจัดการช่องว่างสีขาว
โดยค่าเริ่มต้น heredoc จะไม่ระงับอักขระช่องว่าง (แท็บ ช่องว่าง) เราลบล้างพฤติกรรมนี้ได้โดยเพิ่ม dash (-) หลัง (<<) ตามด้วยตัวคั่น การดำเนินการนี้จะระงับพื้นที่แท็บทั้งหมด แต่จะไม่มีการระงับช่องว่างสีขาว
cat <<- BLOCK
This line has no whitespace.
This line has 2 white spaces at the beginning.
This line has a single tab.
This line has 2 tabs.
This line has 3 tabs.
BLOCK
ตัวแปรและการแทนที่คำสั่ง
Heredoc ยอมรับการแทนที่ตัวแปร ตัวแปรอาจเป็นตัวแปรที่ผู้ใช้กำหนดหรือตัวแปรสภาพแวดล้อม
TODAY=$(date +%F)
cat << BLOCK1
# User defined variables
Today date is = ${TODAY}
#Environ Variables
I am running as = ${USER}
My home dir is = ${HOME}
I am using ${SHELL} as my shell
BLOCK1
ในทำนองเดียวกัน คุณสามารถเรียกใช้คำสั่งใดๆ ภายใน heredoc บล็อคโค้ด
cat << BLOCK2 $(uname -a) BLOCK2
หนีตัวละครพิเศษ
มีหลายวิธีที่เราสามารถหลีกเลี่ยงอักขระพิเศษได้ คุณสามารถทำได้ที่ระดับตัวละครหรือระดับเอกสาร
หากต้องการหลีกเลี่ยงอักขระพิเศษแต่ละตัว ให้ใช้ แบ็กสแลช (\) .
cat << BLOCK4
$(uname -a)
BLOCK4
cat << BLOCK5
Today date is = ${TODAY}
BLOCK5
หากต้องการหลีกเลี่ยงอักขระพิเศษทั้งหมดภายในบล็อกที่ล้อมรอบตัวคั่นด้วยเครื่องหมายคำพูดเดี่ยว เครื่องหมายคำพูดคู่ หรือตัวคั่นคำนำหน้าด้วยเครื่องหมายแบ็กสแลช
cat << 'BLOCK1'
I am running as = ${USER}
BLOCK1
cat << "BLOCK2"
I am running as = ${USER}
BLOCK2
cat << \BLOCK3
I am running as = ${USER}
BLOCK3
cat>
ตอนนี้เรารู้โครงสร้างของ heredoc . แล้ว และวิธีการทำงาน มาดูตัวอย่างกัน พื้นที่ทั่วไป 2 แห่งที่ฉันใช้ heredoc กำลังเรียกใช้กลุ่มคำสั่งบน SSH และส่งข้อความค้นหา SQL ผ่าน heredoc .
ในตัวอย่างด้านล่าง เรากำลังพยายามรันบล็อกของโค้ดในเซิร์ฟเวอร์ระยะไกลผ่าน SSH
ในตัวอย่างด้านล่าง ฉันกำลังผ่าน เลือก คำสั่งไปยัง psql เพื่อเชื่อมต่อกับฐานข้อมูลและเรียกใช้แบบสอบถาม นี่เป็นอีกวิธีหนึ่งในการเรียกใช้แบบสอบถามใน psql ภายในสคริปต์ทุบตีแทนที่จะใช้ -f ตั้งค่าสถานะเพื่อเรียกใช้ .sql ไฟล์.
#!/usr/bin/env bash
UNAME=postgres
DBNAME=testing
psql --username=${UNAME} --password --dbname=${DBNAME} << BLOCK
SELECT * FROM COUNTRIES
WHERE region_id = 4;
BLOCK
เพียงเท่านี้สำหรับบทความนี้ มีอะไรอีกมากมายที่คุณทำได้ด้วย heredoc เมื่อเทียบกับสิ่งที่เราได้แสดงให้เห็นในตัวอย่าง หากคุณมีแฮ็คที่เป็นประโยชน์กับ heredoc โปรดโพสต์ในส่วนความคิดเห็นเพื่อให้ผู้อ่านของเราได้รับประโยชน์จากสิ่งนั้น