Ví dụ: nếu tôi có tập lệnh ./foo có 10 tham số và tôi chỉ muốn truyền tham số thứ 8. Cách duy nhất tôi biết làm thế nào để làm điều này hiện tại là:
./foo '' '' '' '' '' '' '' 'bar'
Có cách nào dễ dàng hơn / tốt hơn không?
Ví dụ: nếu tôi có tập lệnh ./foo có 10 tham số và tôi chỉ muốn truyền tham số thứ 8. Cách duy nhất tôi biết làm thế nào để làm điều này hiện tại là:
./foo '' '' '' '' '' '' '' 'bar'
Có cách nào dễ dàng hơn / tốt hơn không?
Câu trả lời:
Một cách khác để làm điều này là đặt tên cho tham số bạn muốn khai báo và sau đó làm như vậy:
{ cat >./foo
chmod +x ./foo
eight=declared ./foo
eight=declared_and_preferred \
./foo 1 2 3 4 5 6 7 8
./foo 1 2 3 4 5 6 7 8
./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT
$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default
Trong ví dụ trên, biến môi trường được khai báo rõ ràng được ưu tiên cho đối số dòng lệnh, nhưng đối số dòng lệnh được sử dụng khi biến môi trường trống hoặc không đặt. Khi cả biến vị trí thứ 8 và biến môi trường $eight
đều trống hoặc bỏ đặt giá trị mặc định, some_default được gán cho $eight
. Trong cả hai trường hợp, :
có thể xóa khỏi các câu lệnh :-
hoặc :=
nếu trống sẽ là một giá trị chấp nhận được.
Biến $eight
cũng có thể được đặt như sau:
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
... và dòng trước đó đã bỏ qua hoàn toàn nhưng tôi muốn chứng minh rằng việc khai báo một biến theo cách đó sẽ dẫn đến một giá trị liên tục, và vì vậy tôi đã thực hiện nó trong hai lệnh. Cả hai cách $eight
đều được đặt thành giá trị cuối cùng của việc mở rộng tham số ghép đó.
getopts
- đối với các tập lệnh mạnh mẽ - thường là cách tốt nhất để xử lý các tùy chọn lệnh . Mặt khác, các tham số vị trí hầu như luôn là phương tiện đơn giản nhất để xử lý mạnh mẽ các toán hạng trong tập lệnh.
Ví dụ:
touch file$(seq -ws\ file 100)
./foo *
$eight = file008
Ở đó chúng tôi chỉ thấy toán hạng thứ tám, nhưng có 101 trong số chúng được đặt trong thư mục thử nghiệm của tôi.
Giả sử bạn có thể thay đổi tập lệnh, bạn nên xem xét sử dụng các tham số tùy chọn (tùy chọn) thay vì tham số bắt buộc (đối số).
Nếu bạn có mỗi trong số bảy tham số đầu tiên làm tùy chọn và để chúng mặc định cho chuỗi trống thì bạn có thể thực hiện:
./foo bar
Nếu bạn sử dụng trình bao tương thích POSIX, bạn có thể sử dụng getopts
tiện ích hoặc chương trình getopt
. bash
- giống như hầu hết các shell - cung cấp getopts
dưới dạng tích hợp. Cả hai cách đều dễ hơn là cuộn trình phân tích cú pháp dòng lệnh của riêng bạn.
Trừ khi bạn triển khai một cái gì đó giống như các đối số không phải tùy chọn X cuối cùng là các giá trị cho các đối số tùy chọn Y và đối số XY cuối cùng, bạn phải cung cấp các chuỗi tùy chọn trước mỗi chuỗi 7 (bây giờ trống) nếu bạn muốn đặt bất kỳ đối số nào trong số đó. Tuy nhiên, đây không phải là thông lệ, thông thường, một tùy chọn luôn là một tùy chọn và một đối số là một đối số và thứ tự của tùy chọn "chèn" là miễn phí.
+1
cho getopt(s)
. Thông số vị trí là một thời gian buồn, và nên tránh.