Tôi không phải là một người Linux nhưng bị mắc kẹt trong một số Script mà tôi phải đọc cho Dự án của mình. Vì vậy, bất cứ ai có thể giúp tôi những gì lệnh này đang làm?
shift $(($optind - 1))
Tôi không phải là một người Linux nhưng bị mắc kẹt trong một số Script mà tôi phải đọc cho Dự án của mình. Vì vậy, bất cứ ai có thể giúp tôi những gì lệnh này đang làm?
shift $(($optind - 1))
Câu trả lời:
shift $((OPTIND-1))
(lưu ý OPTIND
là chữ hoa) thường được tìm thấy ngay sau một getopts
while
vòng lặp. $OPTIND
là số lượng tùy chọn được tìm thấy bởi getopts
.
Như pauljohn32 đề cập trong các ý kiến, nói đúng ra, OPTIND
đưa ra vị trí của đối số dòng lệnh tiếp theo .
Từ tài liệu tham khảo GNU Bash :
tên optopts getopts [args]
getopts
được sử dụng bởi các kịch bản shell để phân tích các tham số vị trí.optstring
chứa các ký tự tùy chọn được nhận dạng; nếu một ký tự được theo sau bởi dấu hai chấm, tùy chọn dự kiến sẽ có một đối số, nên được phân tách khỏi nó bằng khoảng trắng. Dấu hai chấm (':') và dấu hỏi ('?') Có thể không được sử dụng làm ký tự tùy chọn. Mỗi lần nó được gọi,getopts
đặt tùy chọn tiếp theo vào tên biến shell, khởi tạoname
nếu nó không tồn tại và chỉ mục của đối số tiếp theo sẽ được xử lý thành biếnOPTIND
.OPTIND
được khởi tạo thành 1 mỗi lần shell hoặc script shell được gọi. Khi một tùy chọn yêu cầu một đối số, hãy đặt các đối số đó vào biếnOPTARG
. Vỏ không thiết lập lạiOPTIND
tự động; nó phải được đặt lại thủ công giữa nhiều lệnh gọigetopts
trong cùng một lệnh gọi shell nếu sử dụng một bộ tham số mới.Khi kết thúc các tùy chọn gặp phải,
getopts
thoát với giá trị trả về lớn hơn 0.OPTIND
được đặt thành chỉ mục của đối số không phải tùy chọn đầu tiên và tên được đặt thành '?'.
getopts
thường phân tích cú pháp các tham số vị trí, nhưng nếu có nhiều đối số được đưa vàoargs
,getopts
thay vào đó sẽ phân tích cú pháp các tham số đó.
shift
n
loại bỏ n chuỗi khỏi danh sách tham số vị trí. Do đó, shift $((OPTIND-1))
loại bỏ tất cả các tùy chọn đã được phân tích cú pháp getopts
khỏi danh sách tham số, và vì vậy sau thời điểm đó, $1
sẽ tham chiếu đến đối số không phải tùy chọn đầu tiên được truyền cho tập lệnh.
Cập nhật
Như mikeerv đề cập trong bình luận, shift $((OPTIND-1))
có thể không an toàn. Để ngăn chặn việc chia tách từ không mong muốn, v.v., tất cả các mở rộng tham số nên được trích dẫn kép. Vì vậy, hình thức an toàn cho lệnh là
shift "$((OPTIND-1))"
find
) có thể trông giống như họ cho phép các tùy chọn sau khi không có tùy chọn, nhưng họ không: họ có các toán hạng bắt đầu bằng dấu gạch ngang.
IFS
, nhưng tốt hơn hết là an toàn hơn là xin lỗi. ;)
IFS=0123456789
, shift $((OPTIND-1))
(không có dấu ngoặc kép) sẽ biến thành shift ""
sẽ bị bỏ qua âm thầm (in ksh
) hoặc tạo ra lỗi (trong bash
và dash
).
$((...))
chỉ tính toán công cụ. Trong trường hợp của bạn, nó nhận giá trị $optint
và cơ số 1.
shift
loại bỏ các tham số vị trí. Trong trường hợp của bạn, nó loại bỏ optint-1
các tham số.
Để biết thêm thông tin có một cái nhìn tại help getopts
, help shift
, nhìn vào man bash
để "mở rộng số học", và đặc biệt là google cho getopts
.