Tôi đã nghĩ ra một cách mà getopts
có thể được mở rộng đến các tùy chọn kết hợp thực sự và thông số vị trí. Ý tưởng là để luân phiên giữa gọi getopts
và gán bất kỳ tham số vị trí tìm thấy n1
, n2
, n3
, v.v .:
parse_args() {
_parse_args 1 "[email protected]"
}
_parse_args() {
local n="$1"
shift
local options_func="$1"
shift
local OPTIND
"$options_func" "[email protected]"
shift $((OPTIND - 1))
if [ $# -gt 0 ]; then
eval test -n \${n$n+x}
if [ $? -eq 0 ]; then
eval n$n="\$1"
fi
shift
_parse_args $((n + 1)) "$options_func" "[email protected]"
fi
}
Sau đó, trong trường hợp của OP, bạn có thể sử dụng nó như:
main() {
local n1='' n2='' n3=''
local duration hostname script
parse_args parse_main_options "[email protected]"
echo "n1 = $n1"
echo "n2 = $n2"
echo "n3 = $n3"
echo "duration = $duration"
echo "hostname = $hostname"
echo "script = $script"
}
parse_main_options() {
while getopts d:h:s: opt; do
case "$opt" in
d) duration="$OPTARG" ;;
h) hostname="$OPTARG" ;;
s) script="$OPTARG" ;;
esac
done
}
main "[email protected]"
Chạy nó cho thấy kết quả đầu ra:
$ myshell.sh param1 param2 -h hostname param3 -d waittime -s test.sh
n1 = param1
n2 = param2
n3 = param3
duration = waittime
hostname = hostname
script = test.sh
Chỉ là bằng chứng về khái niệm, nhưng có thể hữu ích cho người nào.
Lưu ý: có một Gotcha nếu một chức năng sử dụng parse_args
gọi một chức năng sử dụng parse_args
và chức năng bên ngoài tuyên bố ví dụlocal n4=''
, nhưng một trong những nội không và 4 hoặc nhiều tham số vị trí được truyền cho hàm nội
Nguồn
2014-08-31 20:48:48
bạn đang cố gắng làm gì đây? Bạn muốn gọi 'test.sh param1 param2 param3' vào' myshell.sh'? –
Xin lỗi nếu nó không rõ ràng từ câu hỏi. Vâng. Tôi muốn cho phép kịch bản của tôi xử lý kết hợp các tham số vị trí và các giá trị getopt. tất cả mọi thứ còn lại từ getopt phải được truyền với kịch bản shell bên dưới. – SiB
Chỉ dòng đầu tiên tuân thủ các tiêu chuẩn unix (xem bên dưới) để xử lý tùy chọn. Làm như vậy nếu không sẽ có nhiều công việc hơn để có được quyền, và để duy trì. –