<ก่อนหน้านี้ | เนื้อหา | ถัดไป>
การจัดการพารามิเตอร์ตำแหน่ง พร้อม
บางครั้งก็มีประโยชน์ในการจัดการพารามิเตอร์ตำแหน่งทั้งหมดเป็นกลุ่ม ตัวอย่างเช่น เราอาจต้องการเขียน "wrapper" รอบโปรแกรมอื่น ซึ่งหมายความว่าเราสร้างสคริปต์หรือฟังก์ชันเชลล์ที่ทำให้การเรียกใช้โปรแกรมอื่นง่ายขึ้น ในกรณีนี้ wrapper จะจัดเตรียมรายการตัวเลือกบรรทัดคำสั่ง arcane แล้วส่งรายการอาร์กิวเมนต์ไปยังโปรแกรมระดับล่าง
เชลล์จัดเตรียมพารามิเตอร์พิเศษสองตัวสำหรับจุดประสงค์นี้ ทั้งคู่ขยายไปยังรายการพารามิเตอร์ตำแหน่งทั้งหมด แต่แตกต่างกันในลักษณะที่ค่อนข้างละเอียดอ่อน พวกเขาคือ:
ตารางที่ 32-1: พารามิเตอร์พิเศษ * และ @
คำอธิบายพารามิเตอร์
คำอธิบายพารามิเตอร์
$* ขยายเข้าไปในรายการของพารามิเตอร์ตำแหน่ง โดยเริ่มต้นด้วย 1 เมื่อล้อมรอบด้วยเครื่องหมายคำพูดคู่ มันจะขยายเป็นสตริงที่มีเครื่องหมายอัญประกาศคู่ซึ่งมีพารามิเตอร์ตำแหน่งทั้งหมด โดยแต่ละตัวคั่นด้วยอักขระตัวแรกของตัวแปรเชลล์ IFS (โดยค่าเริ่มต้น ช่องว่าง อักขระ).
$@ ขยายเข้าไปในรายการพารามิเตอร์ตำแหน่ง โดยเริ่มต้นด้วย 1 เมื่อล้อมรอบด้วยเครื่องหมายคำพูดคู่ จะขยายแต่ละพารามิเตอร์ตำแหน่งเป็นคำที่แยกจากกันซึ่งล้อมรอบด้วยเครื่องหมายคำพูดคู่
นี่คือสคริปต์ที่แสดงพารามิเตอร์พิเศษเหล่านี้ในการดำเนินการ:
การจัดการพารามิเตอร์ตำแหน่งทั้งหมด
#! / bin / ทุบตี
# posit-params3: สคริปต์แสดง $* และ $@ print_params () {
echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4"
}
pass_params () {
echo -e "\n" '$* :'; print_params $* echo -e "\n" '"$*" :'; print_params "$*" echo -e "\n" '$@ :'; print_params $@ echo -e "\n" '"$@" :'; print_params "$@"
}
pass_params "word" "คำที่มีช่องว่าง"
#! / bin / ทุบตี
# posit-params3: สคริปต์แสดง $* และ $@ print_params () {
echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4"
}
pass_params () {
echo -e "\n" '$* :'; print_params $* echo -e "\n" '"$*" :'; print_params "$*" echo -e "\n" '$@ :'; print_params $@ echo -e "\n" '"$@" :'; print_params "$@"
}
pass_params "word" "คำที่มีช่องว่าง"
ในโปรแกรมที่ค่อนข้างซับซ้อนนี้ เราสร้างอาร์กิวเมนต์สองอาร์กิวเมนต์: "word" และ "words with spaces" และส่งผ่านไปยัง pass_params การทำงาน. ในทางกลับกัน ฟังก์ชันนั้นก็จะส่งต่อไปยัง print_params ฟังก์ชัน โดยใช้แต่ละวิธีจากสี่วิธีที่มีกับพารามิเตอร์พิเศษ $* และ $@. เมื่อดำเนินการ สคริปต์จะเปิดเผยความแตกต่าง:
[me@linuxbox ~]$ ตำแหน่ง-param3
-
$1 | = | word |
$2 | = | คำ |
$3 | = | กับ |
$4 | = | ช่องว่าง |
"$*" :
$1 | = | คำที่มีช่องว่าง |
$2 | = | |
$3 | = | |
$4 | = |
-
$1 | = | word |
$2 | = | คำ |
$3 | = | กับ |
$4 | = | ช่องว่าง |
"$@" :
$1 = คำ
$2 = คำที่มีช่องว่าง
$ 3 =
$ 4 =
$2 = คำที่มีช่องว่าง
$ 3 =
$ 4 =
ด้วยข้อโต้แย้งของเราทั้ง $* และ $@ สร้างผลลัพธ์สี่คำ:
คำที่มีช่องว่าง
"$*" ให้ผลลัพธ์เพียงคำเดียว:
"คำที่มีช่องว่าง"
"$@" ให้ผลลัพธ์สองคำ:
"คำ" "คำที่มีช่องว่าง"
ซึ่งตรงกับความตั้งใจจริงของเรา บทเรียนจากสิ่งนี้คือ แม้ว่าเชลล์จะมีสี่วิธีในการรับรายการพารามิเตอร์ตำแหน่ง "$@" มีประโยชน์มากที่สุดสำหรับสถานการณ์ส่วนใหญ่ เนื่องจากจะรักษาความสมบูรณ์ของพารามิเตอร์ตำแหน่งแต่ละตัว