Tôi sử dụng getopts để phân tích các đối số trong các tập lệnh bash như
while getopts ":hd:" opt; do
case $opt in
d ) echo "directory = $OPTARG"; mydir="$OPTARG"; shift $((OPTIND-1)); OPTIND=1 ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
exeparams="$*"
exeparams
sẽ giữ bất kỳ tùy chọn / đối số chưa được chỉnh sửa. Vì tôi muốn sử dụng exeparam để giữ các tùy chọn cho một lệnh được thực thi trong tập lệnh (có thể trùng với các tùy chọn riêng của tập lệnh), tôi muốn sử dụng - để kết thúc các tùy chọn được truyền cho tập lệnh. Nếu tôi vượt qua, vd
myscript -d myscriptparam -- -d internalparam
exeparams
sẽ giữ
-- -d internalparam
Bây giờ tôi muốn loại bỏ phần dẫn --
để truyền các đối số này cho lệnh nội bộ. Có một cách thanh lịch để làm điều này hay tôi có thể có được một chuỗi chỉ giữ phần còn lại mà không có --
từ getopts?
shift; OPTIND=1
bên tronggetopts
vòng lặp có lẽ không phải là cách tốt nhất để làm điều đó. Nó chỉ hoạt động trong trường hợp của bạn vì bạn chỉ có 2 tùy chọn và trong tất cả các tùy chọn khác bạn chỉ cần thoát khỏi tập lệnh. Nếu không, bạn cầnshift; OPTIND=1
trong mọi tùy chọn, có nghĩa là mã trùng lặp (thực tiễn xấu). Chỉ cần thực hiệnshift $((OPTIND - 1))
ngay sau khi kết thúc vòng lặp - đây là cách thông thường nhất và có lẽ cũng hiệu quả nhất.