Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Đối số dòng lệnh trong tập lệnh Shell / Bash [Hướng dẫn]

Hướng dẫn này giải thích cách chuyển các đối số dòng lệnh vào các tập lệnh bash của bạn. Có rất nhiều ví dụ được bao gồm để giúp bạn bắt đầu.

Các tập lệnh Bash / Shell là một cách tuyệt vời để tự động hóa quy trình làm việc Linux của bạn và tăng tốc ngày làm việc của bạn để bạn có thể rời văn phòng sớm (hoặc ẩn trong phòng máy chủ cho đến 5 giờ chiều).

Việc làm cho các tập lệnh có thể tái sử dụng sẽ khiến chúng hữu ích hơn - bạn không cần phải viết một tập lệnh thực hiện cùng một nhiệm vụ cho các bộ thông tin khác nhau hoặc vào các ngày khác nhau - bạn có thể sử dụng lại cùng một tập lệnh và cung cấp các tham số - hướng dẫn được cung cấp cho tập lệnh thông qua dòng lệnh. Điều này đôi khi còn được gọi là sử dụng dòng lệnh đối số .

Ví dụ:bạn có thể có một tập lệnh xuất một số văn bản vào một tệp. Nếu bạn muốn thay đổi tên tệp, bạn phải chỉnh sửa tập lệnh. Nếu bạn muốn tập lệnh xuất ra nhiều tệp, bạn có thể cần nhiều bản sao của tập lệnh trong tay. Sử dụng các tham số, bạn có thể có một tập lệnh duy nhất có thể xuất ra bất kỳ số lượng tệp nào, với bất kỳ tên nào, được chuyển dưới dạng tham số từ dòng lệnh.

Có một số cách khác nhau để chuyển các thông số này - tùy chọn giá trị của chúng - vào kịch bản của bạn, tùy thuộc vào những gì bạn đang cố gắng đạt được. Dưới đây là một số phương pháp, với các ví dụ:

getopts / Flags Phương pháp đọc đầu vào dòng lệnh

  • sự cố là một lệnh shell truy xuất tùy chọn (hoặc cờ ) từ đầu vào dòng lệnh và tạo giá trị của chúng (hoặc đối số ) có sẵn để sử dụng trong các tập lệnh của bạn
    • Các tùy chọn là một chữ cái đứng trước - (gạch ngang), theo sau là giá trị cần chuyển, như giá trị -v
  • Được sử dụng tốt nhất khi đơn đặt hàng không quan trọng
  • Có lẽ là phương pháp tốt nhất trong số tất cả các phương pháp được liệt kê ở đây

getopts Ví dụ về tập lệnh Bash

Tập lệnh ví dụ này có ba tùy chọn cho một đơn hàng thức ăn nhanh:

  • -o cho đơn đặt hàng
  • -s cho kích thước
  • -d cho đồ uống

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";

Nhấp vào đây để tìm hiểu thêm về #! / Bin / bash ở đầu tập lệnh bash.

Để chạy điều này, hãy nhập như sau:

bash ./fastFoodOrder.sh -d Cola -o 'Fish Burger Meal' -s Large

Điều này sẽ dẫn đến việc xuất tập lệnh:

Order: Fish Burger Meal
Size: Large
Drink: Cola

Như bạn có thể thấy trong đầu ra ở trên - thứ tự mà các tùy chọn được cung cấp không quan trọng.

Tại sao ./ được sử dụng khi thực thi tập lệnh?

Chuyển nhiều giá trị cho cùng một tùy chọn

Cũng có thể chuyển một tùy chọn nhiều lần cho nhiều giá trị - sau đó chúng sẽ có sẵn trong tập lệnh dưới dạng một mảng.

Đây là cách tốt nhất để chuyển nhiều giá trị vào một tùy chọn vì nó cho phép bất kỳ ký tự nào được sử dụng trong giá trị - việc chuyển các giá trị trong dấu ngoặc kép hoặc sử dụng dấu phân cách sẽ hạn chế điều này.

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

Tập lệnh trên chấp nhận nhiều -e các tùy chọn để thêm các tính năng bổ sung, như được thấy bên dưới:

bash ./fastFoodOrderExtras.sh -d Cola -o 'Fish Burger Meal' -s Large  -e Sauce -e Salt -e Pepper

Tập lệnh sẽ xuất ra:

Order: Fish Burger Meal
Size: Large
Drink: Cola
The list of extras is 'SauceSaltPepper'
SauceSaltPepper

Sử dụng Tham số Vị trí trong Tập lệnh

  • Được sử dụng khi có một số lượng đối số / tham số đã biết theo một thứ tự cụ thể
  • Được sử dụng tốt nhất cho các tập lệnh đơn giản hơn

Ví dụ

fastFoodOrder.sh

#!/bin/bash

echo "Order: $1";
echo "Size: $2";
echo "Drink: $3";

Để chạy điều này, hãy nhập như sau:

bash ./fastFoodOrder.sh 'Fish Burger Meal' Large Cola

Điều này sẽ dẫn đến việc xuất tập lệnh:

Order: Fish Burger Meal
Size: Large
Drink: Cola

Lưu ý rằng nếu các tùy chọn được cung cấp không theo thứ tự, tất cả các giá trị sẽ bị trộn lẫn. Vị trí quan trọng bằng cách sử dụng phương pháp này!

bash ./fastFoodOrder.sh 'Fish Burger Meal' Cola Large

Sẽ dẫn đến các giá trị được chỉ định không chính xác:

Order: Fish Burger Meal
Size: Cola
Drink: Large

Sử dụng vòng lặp để đọc tham số dòng lệnh

  • Được sử dụng tốt nhất khi không biết trước số lượng tùy chọn / đối số
    • Ví dụ:bạn có thể cung cấp danh sách các thành phần cho một công thức
  • Nó sử dụng biến tích hợp admin@wsxdn.com, chứa một mảng tất cả các tùy chọn đầu vào do người dùng cung cấp

Ví dụ

công thức.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

Chạy nó:

sh ./recipe.sh bread lettuce cheese hamburger

Cái nào sẽ xuất ra:

Ingredient number 1 is bread
Ingredient number 2 is lettuce
Ingredient number 3 is cheese
Ingredient number 4 is hamburger