ในบทช่วยสอนนี้ เราจะอธิบายสองส่วนขยาย bash ที่มีประโยชน์ที่สุดที่ใช้ในเชลล์สคริปต์:
- $() – การแทนที่คำสั่ง
- ${} – การแทนที่พารามิเตอร์/การขยายตัวแปร
การขยายในเชลล์ดำเนินการบนสคริปต์หลังจากแยกออกเป็นโทเค็นแล้ว โทเค็นคือลำดับของอักขระที่เชลล์ถือเป็นหน่วยเดียว อาจเป็นคำหรือตัวดำเนินการก็ได้
เราได้เรียกใช้ตัวอย่างและสคริปต์ทั้งหมดที่กล่าวถึงในบทความนี้เกี่ยวกับระบบ Debian 10 Buster อย่างไรก็ตาม คุณสามารถทำซ้ำได้อย่างง่ายดายบนเชลล์ Linux ส่วนใหญ่ เรากำลังใช้บรรทัดคำสั่งเริ่มต้นของ Debian คือ Terminal สำหรับบทช่วยสอนนี้ บน Debian คุณสามารถเข้าถึงได้ผ่านแถบค้นหา Application Launcher ดังนี้:
ในการเข้าถึงตัวเปิดใช้แอปพลิเคชัน เพียงกดปุ่ม Super/Windows บนแป้นพิมพ์ของคุณ
$() การแทนที่คำสั่ง
ตามคู่มืออ้างอิง GNU Bash อย่างเป็นทางการ:
การแทนที่คำสั่งอนุญาตให้เอาต์พุตของคำสั่งแทนที่คำสั่งเอง Bash ดำเนินการขยายโดยดำเนินการคำสั่งและแทนที่การแทนที่คำสั่งด้วยเอาต์พุตมาตรฐานของคำสั่ง โดยลบการขึ้นบรรทัดใหม่ต่อท้าย บรรทัดใหม่ที่ฝังไว้จะไม่ถูกลบ แต่อาจถูกลบระหว่างการแยกคำ การแทนที่คำสั่งจะเกิดขึ้นเมื่อมีการปิดคำสั่งดังต่อไปนี้:
$(สั่งการ)หรือ
``สั่งการ``
ตัวอย่างเช่น คำสั่ง echo ต่อไปนี้จะแทนที่เอาต์พุตของคำสั่ง date เป็นอินพุต:
$โยนออก$(วันที่)$โยนออก'วันที่'
คุณยังสามารถใช้การแทนที่คำสั่งเพื่อกำหนดค่าให้กับตัวแปรได้อีกด้วย ตัวอย่างเช่น เราจะพิมพ์วันที่ของวันนี้ผ่านตัวแปร TODAY ดังนี้:
$วันนี้= $(วันที่)$โยนออก '$TODAY'
ยูทิลิตี้อื่นของการทดแทนคำสั่งอยู่ในเชลล์ลูปเพื่อรับอินพุต ที่นี่ เราจะพยายามพิมพ์ไฟล์ .txt ทั้งหมดในโฟลเดอร์หลักของเราโดยใช้การแทนที่คำสั่ง:
สำหรับNSใน /บ้าน/ถึงคุณ/ *.txtทำ
โยนออก '$f'
เสร็จแล้ว
การใช้การทดแทนคำสั่งในเชลล์สคริปต์
ตัวอย่างข้างต้นเป็นวิธีที่คุณสามารถใช้พลังของการแทนที่คำสั่งในเชลล์สคริปต์ของคุณได้ นี่คือตัวอย่างรายงานสถานะที่เราสามารถพิมพ์โดยใช้เชลล์สคริปต์ต่อไปนี้:
#!/bin/shโยนออก ***รายงานสถานะ***
วันนี้= $(วันที่)
โยนออก 'วันนี้เป็น$TODAY'
ผู้ใช้= $(ใคร | ห้องน้ำ-NS)
โยนออก '$USERSผู้ใช้กำลังเข้าสู่ระบบ'
UPTIME= $(วันที่;เวลาทำงาน)
โยนออก 'เวลาทำงานคือ$UPTIME'
มีการใช้การแทนที่คำสั่งสามครั้งในสคริปต์นี้ ในการพิมพ์วันที่ ผู้ใช้ที่เข้าสู่ระบบ และเวลาทำงาน เราบันทึกสคริปต์ดังนี้:
ทำให้สามารถเรียกใช้งานได้แล้วรันผ่านคำสั่งต่อไปนี้:
$chmod+ x สถานะ.sh$./สเตตัส.sh
นี่คือผลลัพธ์ของสคริปต์ status.sh ของเรา:
แน่นอน คุณสามารถสร้างสคริปต์ที่มีความหมายมากขึ้นโดยทำตามตัวอย่างที่เราเพิ่งกล่าวถึง
${} การแทนที่/การขยายพารามิเตอร์
พารามิเตอร์ใน Bash เป็นเอนทิตีที่ใช้ในการเก็บค่า พารามิเตอร์สามารถอ้างอิงได้ด้วยตัวเลข ชื่อ หรือสัญลักษณ์พิเศษ เมื่อพารามิเตอร์ถูกอ้างอิงด้วยตัวเลข จะเรียกว่า a พารามิเตอร์ตำแหน่ง . เมื่อพารามิเตอร์ถูกอ้างอิงโดยชื่อ จะเรียกว่า a ตัวแปร . เมื่อพารามิเตอร์ถูกอ้างอิงโดยสัญลักษณ์พิเศษ หมายความว่าพารามิเตอร์เหล่านี้เป็นพารามิเตอร์อัตโนมัติที่มีการใช้งานพิเศษ
การขยาย/ทดแทนพารามิเตอร์ เป็นกระบวนการดึงค่าจากเอนทิตี/พารามิเตอร์ที่อ้างอิง มันเหมือนกับว่าคุณกำลังขยายตัวแปรเพื่อรับค่าของมัน
ไวยากรณ์การขยายพารามิเตอร์ที่ง่ายที่สุดที่เป็นไปได้มีดังต่อไปนี้:
นี่คือวิธีที่คุณสามารถใช้การขยายพารามิเตอร์ใน Bash:
${พารามิเตอร์}ตัวอย่างเช่น การใช้งานที่ง่ายที่สุดคือการแทนที่พารามิเตอร์ด้วยค่าของมัน:
$ชื่อ='จอห์น โด'$โยนออก ${ชื่อ}
คำสั่งนี้จะแทนที่ค่าของชื่อตัวแปรที่จะใช้โดยคำสั่ง echo:
คุณอาจกำลังคิดว่าสามารถทำได้เช่นเดียวกันโดยหลีกเลี่ยงเครื่องมือจัดฟันแบบหยิกดังนี้:
คำตอบคือในระหว่างการขยายพารามิเตอร์ วงเล็บปีกกาเหล่านี้จะช่วยในการกำหนดชื่อตัวแปร ให้เราอธิบายสิ่งที่เราหมายถึงโดยการจำกัดที่นี่ ให้ฉันเรียกใช้คำสั่งต่อไปนี้บนระบบของฉัน:
$โยนออก 'ชื่อคนคือ$name_'ผลลัพธ์ไม่ได้พิมพ์ค่าของชื่อตัวแปรตามที่ระบบคิดว่าฉันหมายถึงตัวแปร name_ ดังนั้น ชื่อตัวแปรของฉันจึงไม่ถูกคั่นด้วย วงเล็บปีกกาในตัวอย่างต่อไปนี้จะกำหนดชื่อตัวแปรและส่งคืนผลลัพธ์ดังนี้:
$โยนออก 'ชื่อคนคือ${ชื่อ}_ 'ต่อไปนี้คือวิธีการแทนที่ตัวแปรใน Shell ทั้งหมด:
$ {ตัวแปร} | คำสั่งนี้แทนค่าของตัวแปร |
${ตัวแปร:-คำ} | หากตัวแปรเป็นค่าว่างหรือไม่ได้ตั้งค่าไว้ คำจะถูกแทนที่ด้วยตัวแปร ค่าของตัวแปรไม่เปลี่ยนแปลง |
${ตัวแปร:=คำ} | หากตัวแปรเป็นค่าว่างหรือไม่ได้ตั้งค่าไว้ ค่าของตัวแปรจะถูกตั้งค่าเป็นคำ |
${ตัวแปร:?ข้อความ} | หากตัวแปรเป็นค่าว่างหรือไม่ได้ตั้งค่าไว้ ข้อความจะถูกพิมพ์ไปยังข้อผิดพลาด bash มาตรฐาน |
${ตัวแปร:+คำ} | ถ้า ตัวแปร ถูกตั้งค่า คำ ถูกแทนที่ด้วยตัวแปร อย่างไรก็ตาม ค่าของตัวแปรเองจะไม่เปลี่ยนแปลง |
ตัวอย่างข้างต้นเป็นวิธีที่คุณสามารถใช้พลังของการทดแทนตัวแปรใน Bash ได้ คุณสามารถรวมวิธีเหล่านี้เพื่อใช้ส่วนขยายในเชลล์สคริปต์เพื่อให้งานของคุณสำเร็จลุล่วงได้อย่างเหมาะสม