Khi chạy tập lệnh shell, có thể truyền các tham số vị trí cụ thể mà không phải nhập tất cả chúng theo thứ tự không?


13

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?


1
Đây là lý do tại sao các chương trình thường sử dụng các tùy chọn thay vì tham số vị trí nếu bạn có nhiều tham số.
Barmar

Câu trả lời:


4

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

ĐẦU RA

$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 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 $eightcũ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 *

ĐẦU RA

$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.


18

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 getoptstiện ích hoặc chương trình getopt. bash- giống như hầu hết các shell - cung cấp getoptsdướ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í.


5
+1cho getopt(s). Thông số vị trí là một thời gian buồn, và nên tránh.
HalosGhost
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.