Làm cách nào tôi có thể nhận được các đối số còn lại sau khi rút các mục được phân tích cú pháp bằng cách sử dụng getopts?


14

Tôi muốn phân tích một số đối số cho một tập lệnh bash bằng cách sử dụng getopts nhưng muốn có thể truy cập các đối số còn lại không có trong danh sách tùy chọn. Vì vậy, ví dụ, nếu tôi có một cuộc gọi:

% script -a -b param -c param -d other arguments here

Tôi sẽ có:

while getopts "ab:c:d" opt ; do
.
done

Cách dễ nhất để có được "các đối số khác ở đây", mà không được xử lý bởi getopts là gì?

Câu trả lời:


17

bạn cần thay đổi khi bạn phân tích một đối số hoặc đặt

thay đổi $ ((OPTIND -1)) sau khi bạn phân tích xong, sau đó xử lý theo cách thông thường, vd

while getopts "ab:c:d" opt ; do
.
done
shift $(expr $OPTIND - 1 )

while test $# -gt 0; do
  echo $1
  shift
done

1
Thật đáng để giải thích, $ OPTIND là chỉ mục của tùy chọn tiếp theo sẽ được xem xét, sau khi mỗi lần khởi động được chạy. Do đó, $ * chứa 3 tham số, sau cuộc gọi hợp lệ đầu tiên là 2 và cuộc gọi thứ hai là 3. Nếu cuộc gọi không hợp lệ, cuộc gọi sẽ bị hủy với giá trị trước đó. Vì vậy, nếu tham số 1 không hợp lệ, thì OPTIND sẽ là 1 (do đó ví dụ trên sẽ shift $(expr 1 - 1)an toàn.
sibaz

0

Khi kết thúc phân tích cú pháp, một khi bạn đã thay đổi biến $ @ chứa cuối dòng:

while getopts "ab:c:d" opt ; do
.
done
shift $((OPTIND-1))
OTHERARGS=$@
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.