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

วิธีใช้ Heredoc ใน Shell Scripting

เอกสารที่นี่ (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 ใน Shell Scripting

การจัดการช่องว่างสีขาว

โดยค่าเริ่มต้น 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 ใน Shell Scripting

ตัวแปรและการแทนที่คำสั่ง

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
วิธีใช้ Heredoc ใน Shell Scripting วิธีใช้ Heredoc ใน Shell Scripting

หนีตัวละครพิเศษ

มีหลายวิธีที่เราสามารถหลีกเลี่ยงอักขระพิเศษได้ คุณสามารถทำได้ที่ระดับตัวละครหรือระดับเอกสาร

หากต้องการหลีกเลี่ยงอักขระพิเศษแต่ละตัว ให้ใช้ แบ็กสแลช (\) .

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 ใน Shell Scripting

ตอนนี้เรารู้โครงสร้างของ heredoc . แล้ว และวิธีการทำงาน มาดูตัวอย่างกัน พื้นที่ทั่วไป 2 แห่งที่ฉันใช้ heredoc กำลังเรียกใช้กลุ่มคำสั่งบน SSH และส่งข้อความค้นหา SQL ผ่าน heredoc .

ในตัวอย่างด้านล่าง เรากำลังพยายามรันบล็อกของโค้ดในเซิร์ฟเวอร์ระยะไกลผ่าน SSH

วิธีใช้ Heredoc ใน Shell Scripting

ในตัวอย่างด้านล่าง ฉันกำลังผ่าน เลือก คำสั่งไปยัง 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 ใน Shell Scripting

เพียงเท่านี้สำหรับบทความนี้ มีอะไรอีกมากมายที่คุณทำได้ด้วย heredoc เมื่อเทียบกับสิ่งที่เราได้แสดงให้เห็นในตัวอย่าง หากคุณมีแฮ็คที่เป็นประโยชน์กับ heredoc โปรดโพสต์ในส่วนความคิดเห็นเพื่อให้ผู้อ่านของเราได้รับประโยชน์จากสิ่งนั้น