วิธีการส่งอาร์กิวเมนต์ไปเป็นสคริปต์ Bash

คำสั่งไวยากรณ์และตัวอย่าง

คุณสามารถเขียน สคริปต์ทุบตี เพื่อให้ได้รับอาร์กิวเมนต์ที่ระบุเมื่อสคริปต์ถูกเรียกจากบรรทัดคำสั่ง วิธีนี้ใช้เมื่อสคริปต์ต้องทำหน้าที่แตกต่างกันเล็กน้อยขึ้นอยู่กับค่าของพารามิเตอร์อินพุท (อาร์กิวเมนต์)

ตัวอย่างเช่นคุณอาจมีสคริปต์ที่เรียกว่า "stats.sh" ซึ่งจะดำเนินการกับไฟล์โดยเฉพาะเช่นการนับคำศัพท์ ถ้าคุณต้องการใช้สคริปต์ดังกล่าวกับไฟล์จำนวนมากคุณควรส่งชื่อไฟล์เป็นอาร์กิวเมนต์เพื่อให้คุณสามารถใช้สคริปต์เดียวกันสำหรับไฟล์ทั้งหมดที่จะประมวลผลได้ ตัวอย่างเช่นถ้าชื่อของไฟล์ที่จะประมวลผลเป็น "songlist" คุณจะต้องป้อนบรรทัดคำสั่งต่อไปนี้:

sh stats.sh songlist

มีการเข้าถึงอาร์กิวเมนต์ภายในสคริปต์โดยใช้ตัวแปร $ 1, $ 2, $ 3 เป็นต้นซึ่ง $ 1 หมายถึงอาร์กิวเมนต์แรก $ 2 ถึงอาร์กิวเมนต์ที่สองเป็นต้น นี่คือตัวอย่างในตัวอย่างต่อไปนี้:

FILE1 = $ 1 wc $ FILE1

สำหรับความสามารถในการอ่านให้กำหนดตัวแปรที่มีชื่ออธิบายให้เป็นค่าอาร์กิวเมนต์แรก ($ 1) จากนั้นให้เรียกใช้อรรถประโยชน์การนับคำ ( wc ) ในตัวแปรนี้ ($ FILE1)

หากคุณมีตัวแปรจำนวนอาร์กิวเมนต์คุณสามารถใช้ตัวแปร "$ @" ซึ่งเป็นอาร์เรย์ของพารามิเตอร์ป้อนเข้าทั้งหมด ซึ่งหมายความว่าคุณสามารถใช้ for-loop เพื่อประมวลผลแต่ละครั้งได้ตามที่แสดงในตัวอย่างต่อไปนี้:

สำหรับ FILE1 ใน "$ @" ให้ทำ wc $ FILE1 เรียบร้อยแล้ว

นี่คือตัวอย่างของวิธีเรียกสคริปต์นี้ด้วยอาร์กิวเมนต์จากบรรทัดคำสั่ง:

sh stats.sh songlist1 songlist2 songlist3

หากอาร์กิวเมนต์มีช่องว่างคุณต้องใส่ข้อมูลดังกล่าวด้วยเครื่องหมายคำพูดเดียว ตัวอย่างเช่น:

sh stats.sh 'songlist 1' 'songlist 2' 'songlist 3'

บ่อยๆสคริปต์จะถูกเขียนขึ้นเพื่อให้ผู้ใช้สามารถส่งผ่านอาร์กิวเมนต์ในลำดับใด ๆ โดยใช้ธง ด้วยวิธีธงคุณสามารถกำหนดอาร์กิวเมนต์ได้ด้วย

สมมติว่าคุณมีสคริปต์ที่เรียกค้นข้อมูลจากฐานข้อมูลตามพารามิเตอร์ที่ระบุเช่น "ชื่อผู้ใช้", "วันที่" และ "ผลิตภัณฑ์" และสร้างรายงานใน "รูปแบบ" ที่ระบุ ตอนนี้คุณต้องการเขียนสคริปต์ของคุณเพื่อให้คุณสามารถส่งผ่านพารามิเตอร์เหล่านี้ได้เมื่อเรียกใช้สคริปต์ อาจเป็นเช่นนี้:

makereport -u jsmith -p notebooks -d 10-20-2011 -f pdf

Bash ทำให้ฟังก์ชันนี้มีฟังก์ชัน "getopts" สำหรับตัวอย่างข้างต้นคุณสามารถใช้ getopts ได้ดังนี้:

นี่คือ ลูปในขณะ ที่ใช้ฟังก์ชัน "getopts" และ "optstring" ที่เรียกว่า "u: d: p: f:" เพื่อย้ำผ่านอาร์กิวเมนต์ ขณะที่ลูปเดินผ่าน optstring ซึ่งมีแฟล็กที่สามารถใช้ในการส่งอาร์กิวเมนต์และกำหนดค่าอาร์กิวเมนต์ที่ระบุไว้สำหรับค่าสถานะนั้นไปยังตัวแปร "option" case-statement จะกำหนดค่าของตัวแปร "option" ให้เป็นตัวแปรส่วนกลางที่สามารถใช้งานได้หลังจากได้อ่านอาร์กิวเมนต์ทั้งหมดแล้ว

เครื่องหมายทับอยู่ใน optstring หมายความว่าต้องมีค่าสำหรับธงที่เกี่ยวข้อง ในตัวอย่างข้างต้นธงทั้งหมดจะตามด้วยเครื่องหมายจุดคู่: "u: d: p: f:" ซึ่งหมายความว่าธงทั้งหมดต้องมีค่า ถ้าเช่น "d" และ "f" ธงไม่คาดว่าจะมีค่า optstring จะเป็น "u: dp: f"

เครื่องหมายจุดเริ่มต้นของ optstring ตัวอย่างเช่น ": u: d: p: f:" มีความหมายที่แตกต่างกันอย่างสิ้นเชิง จะช่วยให้คุณสามารถจับธงที่ไม่ได้แสดงใน optstring ในกรณีนี้ค่าของตัวแปร "option" ถูกตั้งไว้ที่ "?" และค่าของ "OPTARG" ถูกตั้งไว้ที่ธงที่ไม่คาดคิด ช่วยให้คุณสามารถแสดงข้อความแสดงข้อผิดพลาดที่เหมาะสมเพื่อแจ้งให้ผู้ใช้ทราบ

อาร์กิวเมนต์ที่ไม่ได้นำหน้าด้วยธงจะถูกละเว้นโดย getopts หากไม่มีการระบุค่าใน optstring เมื่อเรียกใช้สคริปต์จะไม่มีอะไรเกิดขึ้นเว้นแต่คุณจะจัดการกับกรณีนี้ในโค้ดของคุณโดยเฉพาะ อาร์กิวเมนต์ใดที่จัดการโดย getops ยังคงสามารถจับภาพได้โดยใช้ตัวแปรปกติ $ 1, $ 2 เป็นต้น