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

Cách bao gồm các tùy chọn trong các tập lệnh Bash shell của bạn

Các lệnh đầu cuối thường có các tùy chọn hoặc công tắc mà bạn có thể sử dụng để sửa đổi cách lệnh thực hiện những gì nó làm. Các tùy chọn được bao gồm trong đặc tả POSIX cho các giao diện dòng lệnh. Đây cũng là một quy ước lâu đời được thiết lập với các ứng dụng UNIX sớm nhất, vì vậy bạn nên biết cách đưa chúng vào các tập lệnh Bash của mình khi bạn đang tạo các lệnh của riêng mình.

Như với hầu hết các ngôn ngữ, có một số cách để giải quyết vấn đề về các tùy chọn phân tích cú pháp trong Bash. Cho đến ngày nay, phương pháp yêu thích của tôi vẫn là phương pháp mà tôi học được từ các tập lệnh xây dựng Slackware của Patrick Volkerding, được coi là bài giới thiệu của tôi về kịch bản shell khi tôi lần đầu tiên khám phá ra Linux và dám mạo hiểm vào các tệp văn bản thuần túy đi kèm với hệ điều hành này.

Tùy chọn phân tích cú pháp trong Bash

Chiến lược phân tích cú pháp các tùy chọn trong Bash là duyệt qua tất cả các đối số được chuyển đến tập lệnh shell của bạn, xác định xem chúng có phải là một tùy chọn hay không, rồi chuyển sang đối số tiếp theo. Lặp lại quá trình này cho đến khi không còn tùy chọn nào.

Bắt đầu với một tùy chọn Boolean đơn giản (đôi khi được gọi là công tắc hoặc một cờ ):

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done

echo $ALPHA

Trong mã này, tôi tạo một while vòng lặp đóng vai trò như một vòng lặp vô hạn cho đến khi không còn đối số nào để xử lý. if câu lệnh cố gắng khớp với bất kỳ đối số nào được tìm thấy ở vị trí đầu tiên ($1 ) thành --alpha hoặc -a . (Đây là những tên tùy chọn tùy ý không có ý nghĩa đặc biệt. Trong một tập lệnh thực tế, bạn có thể sử dụng --verbose-v để kích hoạt đầu ra dài dòng).

shift từ khóa làm cho tất cả các đối số dịch chuyển bằng 1, sao cho một đối số ở vị trí 2 ($2 ) được chuyển vào vị trí 1 ($1 ). else câu lệnh được kích hoạt khi không có thêm đối số nào để xử lý, điều này sẽ phá vỡ while vòng lặp.

Ở cuối tập lệnh, giá trị của $ALPHA được in tới thiết bị đầu cuối.

Kiểm tra tập lệnh:

$ bash ./test.sh --alpha
1
$ bash ./test.sh

$ bash ./test.sh -a
1

Tùy chọn được phát hiện chính xác.

Phát hiện đối số trong Bash

Tuy nhiên, có một vấn đề:Các đối số bổ sung bị bỏ qua.

$ bash ./test.sh --alpha foo
1
$

Để bắt các đối số không phải là tùy chọn, bạn có thể kết xuất các đối số còn lại vào một mảng Bash.

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done

echo $ALPHA

ARG=( "${@}" )
for i in ${ARG[@]}; do
    echo $i
done

Kiểm tra phiên bản mới của tập lệnh:

$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo

foo
$ bash ./test.sh --alpha foo bar
1
foo
bar

Tùy chọn có đối số

Một số tùy chọn yêu cầu một đối số của riêng chúng. Ví dụ:bạn có thể muốn cho phép người dùng đặt một thuộc tính như màu sắc hoặc độ phân giải của đồ họa hoặc trỏ ứng dụng của bạn đến tệp cấu hình tùy chỉnh.

Để triển khai điều này trong Bash, bạn có thể sử dụng shift từ khóa như bạn làm với công tắc Boolean nhưng thay đổi các đối số bằng 2 thay vì 1.

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
    CONFIG=$2
    shift 2
else
    break
fi
done

echo $ALPHA
echo $CONFIG

ARG=( "${@}" )

for i in ${ARG[@]}; do
    echo $i
done

Trong mã này, tôi thêm một elif mệnh đề để so sánh từng đối số với cả --config-c . Trong trường hợp trùng khớp, giá trị của một biến được gọi là CONFIG được đặt thành giá trị của bất kỳ đối số thứ hai là gì (điều này có nghĩa là --config tùy chọn yêu cầu một đối số). Tất cả các đối số thay đổi vị trí theo 2:1 thành shift --config hoặc -c và 1 để di chuyển đối số của nó. Như thường lệ, vòng lặp lặp lại cho đến khi không còn đối số phù hợp.

Đây là bản kiểm tra phiên bản mới của tập lệnh:

$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz

Phân tích cú pháp tùy chọn trở nên dễ dàng

Có nhiều cách khác để phân tích cú pháp các tùy chọn trong Bash. Bạn có thể luân phiên sử dụng case câu lệnh hoặc getopt yêu cầu. Dù bạn chọn sử dụng gì, các tùy chọn cho người dùng của bạn là những tính năng quan trọng đối với bất kỳ ứng dụng nào và Bash giúp cho việc này trở nên dễ dàng.