บทช่วยสอนนี้จะอธิบายวิธีส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งไปยังสคริปต์ทุบตีของคุณ มีตัวอย่างมากมายที่จะช่วยให้คุณเริ่มต้นได้
สคริปต์ Bash/Shell เป็นวิธีที่ยอดเยี่ยมในการทำให้เวิร์กโฟลว์ Linux ของคุณทำงานอัตโนมัติและเร่งวันทำงานของคุณ คุณจึงออกจากสำนักงานก่อนเวลาได้ (หรือซ่อนตัวอยู่ในห้องเซิร์ฟเวอร์จนถึงเวลา 17.00 น.)
การทำให้สคริปต์ใช้ซ้ำได้ทำให้มีประโยชน์มากขึ้น – คุณไม่จำเป็นต้องเขียนสคริปต์ที่ทำงานเดียวกันสำหรับชุดข้อมูลที่แตกต่างกันหรือในวันที่แตกต่างกัน – คุณสามารถใช้สคริปต์เดิมซ้ำและระบุ พารามิเตอร์ – คำแนะนำให้กับสคริปต์ผ่านทางบรรทัดคำสั่ง บางครั้งเรียกอีกอย่างว่าการใช้บรรทัดคำสั่ง อาร์กิวเมนต์ .
ตัวอย่างเช่น คุณอาจมีสคริปต์ที่แสดงข้อความบางส่วนไปยังไฟล์ หากคุณต้องการเปลี่ยนชื่อไฟล์ คุณจะต้องแก้ไขสคริปต์ หากคุณต้องการให้สคริปต์ส่งออกไปยังหลายไฟล์ คุณอาจต้องมีสคริปต์หลายชุดในมือ เมื่อใช้พารามิเตอร์ คุณสามารถมีสคริปต์เดียวที่สามารถส่งออกไปยังไฟล์จำนวนเท่าใดก็ได้ โดยใช้ชื่อใดก็ได้ ส่งผ่านเป็น พารามิเตอร์ จากบรรทัดคำสั่ง
มีหลายวิธีในการส่งพารามิเตอร์ .เหล่านี้ – ตัวเลือก และคุณค่า – สำหรับสคริปต์ของคุณ ขึ้นอยู่กับสิ่งที่คุณพยายามทำให้สำเร็จ มีตัวอย่างวิธีการดังต่อไปนี้
gettopts / แฟล็กวิธีการอ่านอินพุตบรรทัดคำสั่ง
- gettopts เป็นคำสั่งเชลล์ที่ดึง ตัวเลือก (หรือ ธง ) จากอินพุตบรรทัดคำสั่งและสร้างค่า (หรือ ข้อโต้แย้ง ) พร้อมใช้งานในสคริปต์ของคุณ
- ตัวเลือกคือตัวอักษรตัวเดียวที่นำหน้าด้วย – (ขีดกลาง) ตามด้วยค่าที่จะส่ง เช่น -v ค่า
- ใช้ดีที่สุดเมื่อลำดับไม่สำคัญ
- น่าจะดีที่สุดในบรรดาวิธีการทั้งหมดที่ระบุไว้ที่นี่
gettopts ตัวอย่างสคริปต์ทุบตี
สคริปต์ตัวอย่างนี้ใช้สามตัวเลือกในการสั่งอาหารจานด่วน:
- -o สำหรับ คำสั่งซื้อ
- -s สำหรับ ขนาด
- -d สำหรับ เครื่องดื่ม
fastFoodOrder.sh
#!/bin/bash # Use a while loop to parse through the options o, s, d while getopts o:s:d: flag do # Match each option (which has been assigned to the $flag variable) to it's meaning using a case statement block # OPTARG will be the value received from getopts for the corresponding option and is assigned to a variable depending on the flag case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; esac done # The values as passed to the options are now available in their corresponding variable echo "Order: $order"; echo "Size: $size"; echo "Drink: $drink";
คลิกที่นี่เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ #!/bin/bash บรรทัดที่จุดเริ่มต้นของสคริปต์ทุบตี
หากต้องการเรียกใช้สิ่งนี้ ให้ป้อนข้อมูลต่อไปนี้:
bash ./fastFoodOrder.sh -d Cola -o 'Fish Burger Meal' -s Large
ซึ่งจะส่งผลให้สคริปต์แสดงผล:
Order: Fish Burger Meal Size: Large Drink: Cola
ดังที่คุณเห็นในผลลัพธ์ด้านบน ลำดับของตัวเลือกนั้นไม่สำคัญ
เหตุใดจึงใช้ ./ เมื่อเรียกใช้งานสคริปต์
ส่งผ่านหลายค่าไปยังตัวเลือกเดียวกัน
นอกจากนี้ยังสามารถส่งตัวเลือกได้หลายครั้งสำหรับค่าต่างๆ หลายค่า จากนั้นจะพร้อมใช้งานในสคริปต์เป็นอาร์เรย์
นี่เป็นวิธีที่ดีที่สุดในการส่งผ่านค่าหลายค่าไปยังตัวเลือกเดียว เนื่องจากอนุญาตให้ใช้อักขระใดก็ได้ในค่านั้น การส่งค่าในเครื่องหมายคำพูดหรือการใช้ตัวคั่นจะเป็นการจำกัดสิ่งนี้
fastFoodOrderExtras.sh
#!/bin/bash # Use a while loop to parse through the options o, s, d, e while getopts o:s:d:e: flag do # Match each option (which has been assigned to the $flag variable) to it's meaning using a case statement block # OPTARG will be the value received from getopts for the corresponding option and is assigned to a variable depending on the flag case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; e) extras+=${OPTARG};;# Create or append an array variable to hold the multiple extras values passed esac done # The values as passed to the options are now available in their corresponding variable echo "Order: $order"; echo "Size: $size"; echo "Drink: $drink"; echo "The list of extras is '${extras[@]}'" # Loop through the multiple extras values for val in "${extras[@]}"; do echo $val done
สคริปต์ด้านบนยอมรับ -e . หลายรายการ ตัวเลือกสำหรับการเพิ่มความพิเศษดังที่แสดงด้านล่าง:
bash ./fastFoodOrderExtras.sh -d Cola -o 'Fish Burger Meal' -s Large -e Sauce -e Salt -e Pepper
สคริปต์จะส่งออก:
Order: Fish Burger Meal Size: Large Drink: Cola The list of extras is 'SauceSaltPepper' SauceSaltPepper
การใช้พารามิเตอร์ตำแหน่งในสคริปต์
- ใช้เมื่อจะมีจำนวนอาร์กิวเมนต์/พารามิเตอร์ที่ทราบในลำดับที่เจาะจง
- ใช้ดีที่สุดสำหรับสคริปต์ที่ง่ายกว่า
ตัวอย่าง
fastFoodOrder.sh
#!/bin/bash echo "Order: $1"; echo "Size: $2"; echo "Drink: $3";
หากต้องการเรียกใช้สิ่งนี้ ให้ป้อนข้อมูลต่อไปนี้:
bash ./fastFoodOrder.sh 'Fish Burger Meal' Large Cola
ซึ่งจะส่งผลให้สคริปต์แสดงผล:
Order: Fish Burger Meal Size: Large Drink: Cola
โปรดทราบว่าหากมีการจัดเตรียมตัวเลือกไว้ไม่เป็นระเบียบ ค่าทั้งหมดจะปะปนกัน ตำแหน่งสำคัญด้วยวิธีนี้!
bash ./fastFoodOrder.sh 'Fish Burger Meal' Cola Large
จะส่งผลให้ค่าที่กำหนดไม่ถูกต้อง:
Order: Fish Burger Meal Size: Cola Drink: Large
การใช้ลูปเพื่ออ่านพารามิเตอร์บรรทัดคำสั่ง
- ใช้ดีที่สุดเมื่อไม่ทราบจำนวนตัวเลือก/ข้อโต้แย้งล่วงหน้า
- ตัวอย่างเช่น คุณอาจกำลังระบุรายการส่วนผสมสำหรับสูตร
- ใช้ตัวแปรบิวท์อิน [email protected] ซึ่งมีอาร์เรย์ของตัวเลือกอินพุตทั้งหมดที่ผู้ใช้จัดหาให้
ตัวอย่าง
recip.sh
#!/bin/bash i=1; # This value is the iterator value - the current number of loops that have completed for ingredient in "[email protected]" # loop through [email protected] which is an array of all passed input parameters do echo "Ingredient number $i is $ingredient";# Print the $ingredient which was passed to the script when it was called i=$((i + 1)); # Increment the iterator value so we know how many times we have looped done
เรียกใช้:
sh ./recipe.sh bread lettuce cheese hamburger
ซึ่งจะส่งออก:
Ingredient number 1 is bread Ingredient number 2 is lettuce Ingredient number 3 is cheese Ingredient number 4 is hamburger