Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

อาร์กิวเมนต์บรรทัดคำสั่งในเชลล์/สคริปต์ทุบตี [บทช่วยสอน]

บทช่วยสอนนี้จะอธิบายวิธีส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งไปยังสคริปต์ทุบตีของคุณ มีตัวอย่างมากมายที่จะช่วยให้คุณเริ่มต้นได้

สคริปต์ 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

การใช้ลูปเพื่ออ่านพารามิเตอร์บรรทัดคำสั่ง

  • ใช้ดีที่สุดเมื่อไม่ทราบจำนวนตัวเลือก/ข้อโต้แย้งล่วงหน้า
    • ตัวอย่างเช่น คุณอาจกำลังระบุรายการส่วนผสมสำหรับสูตร
  • ใช้ตัวแปรบิวท์อิน admin@wsxdn.com ซึ่งมีอาร์เรย์ของตัวเลือกอินพุตทั้งหมดที่ผู้ใช้จัดหาให้

ตัวอย่าง

recip.sh

#!/bin/bash

i=1; # This value is the iterator value - the current number of loops that have completed

for ingredient in "admin@wsxdn.com" # loop through admin@wsxdn.com 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