วิธีใช้การขยาย $() และ ${} ในเชลล์สคริปต์

How Use Expansions Shell Script



หากคุณกำลังใช้ระบบ Linux คุณอาจทราบแล้วว่าอินเทอร์เฟซของเชลล์มีความสำคัญต่อการโต้ตอบกับระบบของคุณเพียงใด ในลีนุกซ์ส่วนใหญ่ Bash เป็นเชลล์เริ่มต้นที่เราใช้เพื่อรันคำสั่งและรันสคริปต์ เชลล์สคริปต์คือชุดของคำสั่งที่เมื่อดำเนินการแล้ว จะใช้เพื่อทำหน้าที่ที่มีประโยชน์บางอย่างบน Linux ไฟล์ .sh นี้ ซึ่งเขียนโดยผู้ใช้ มีคำสั่งทั้งหมดที่ใช้ในการทำงาน เพื่อที่เราจะได้ไม่ต้องรันคำสั่งเหล่านั้นด้วยตนเอง ทีละรายการ

ในบทช่วยสอนนี้ เราจะอธิบายสองส่วนขยาย 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 ได้ คุณสามารถรวมวิธีเหล่านี้เพื่อใช้ส่วนขยายในเชลล์สคริปต์เพื่อให้งานของคุณสำเร็จลุล่วงได้อย่างเหมาะสม