Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Làm Chủ Phân Tích Tùy Chọn Trong Script Bash: Hướng Dẫn Bước Đi Bước

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

Như với hầu hết ngôn ngữ, có một vài cách giải quyết vấn đề phân tích tùy chọn trong Bash. Cho đến ngày nay, phương pháp ưa thích của tôi vẫn là cái tôi học từ script build Slackware của Patrick Volkerding, đóng vai trò giới thiệu tôi với script shell khi tôi lần đầu khám phá 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.

Phân Tích Tùy Chọn Trong Bash

Chiến lược phân tích tùy chọn trong Bash là lặp qua tất cả đối số được truyền cho script shell của bạn, xác định chúng có phải tùy chọn hay không, sau đó shift 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 tùy chọn Boolean đơn giản (đôi khi gọi là công tắc hoặc 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 vòng lặp while đóng vai trò vòng lặp vô tận cho đến khi không còn đối số nào để xử lý. Câu lệnh if cố gắng khớp bất kỳ đối số nào tìm thấy ở vị trí đầu tiên ($1) với --alpha hoặc -a. (Đây là tên tùy chọn tùy ý không có ý nghĩa đặc biệt. Trong script thực tế, bạn có thể dùng --verbose và -v để kích hoạt đầu ra chi tiết).

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

Cuối script, giá trị của $ALPHA được in ra terminal.

Test script:

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

$ bash ./test.sh -a
1

Tùy chọn được phát hiện đúng.

Phát Hiện Đối Số Trong Bash

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

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

Để bắt các đối số không dành làm tùy chọn, bạn có thể đổ các đối số còn lại vào 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

Test phiên bản mới của script:

$ 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 Với Đối Số

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

Để thực hiện điều này trong Bash, bạn có thể dùng từ khóa shift như với công tắc Boolean nhưng shift đối số 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ệnh đề elif để so sánh mỗi đối số với cả --config và -c. Trong trường hợp khớp, giá trị của biến CONFIG được đặt thành giá trị của bất kỳ đối số thứ hai nào (điều này có nghĩa là tùy chọn --config yêu cầu một đối số). Tất cả đối số dịch chuyển vị trí 2: 1 để shift --config hoặc -c, và 1 để di chuyển đối số của nó. Như thường lệ, lặp lại cho đến khi không còn đối số khớp.

Đây là test phiên bản mới của script:

$ 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 Tùy Chọn Làm Dễ Dàng

Có cách khác để phân tích tùy chọn trong Bash. Bạn có thể thay thế dùng câu lệnh case hoặc lệnh getopt. Bất kể bạn chọn dùng gì, tùy chọn cho người dùng là tính năng quan trọng cho bất kỳ ứng dụng nào, và Bash làm cho nó dễ dàng.