เอกสารที่นี่ (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} BLOCK3cat>
ตอนนี้เรารู้โครงสร้างของ 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 โปรดโพสต์ในส่วนความคิดเห็นเพื่อให้ผู้อ่านของเราได้รับประโยชน์จากสิ่งนั้น