Điểm:0

Cảnh báo về các tên tùy chọn không hợp lệ xảy ra giữa các tên tùy chọn hợp lệ

lá cờ jp

Tôi đã viết đoạn bash sau, nhưng cần triển khai thứ gì đó phức tạp hơn một chút.

Nhiệm vụ là phát hiện một tùy chọn không hợp lệ chỉ khi nó xảy ra giữa các tùy chọn đã biết.

Ví dụ, sau đây myfunc -v -w --vlt "Ubuntu" sẽ in

Tùy chọn không xác định -w

Nhưng mà myfunc -v --vlt -w "Ubuntu" sẽ không in bất kỳ thông báo cảnh báo nào vì -w xảy ra sau các đối số không tùy chọn đã biết.

Mã sẽ chỉ kiểm tra tên tùy chọn bắt đầu bằng -. Như vậy myfunc -v -w 5 --vlt "Ubuntu" sẽ chỉ báo cáo về -w, bỏ qua mọi giá trị tùy chọn cho thông báo cảnh báo.

 cho tôi trong "$@"; làm
  trường hợp $i trong
   ("-v"|"--verbosity"|"-u"|"--usage"|"-h"|"--help")
     printf '%s\n' "Tùy chọn: $i"
     ;;
   ("--vlt"|"--blu"|"--grn"|"--ylw")
     printf '%s\n' "Tùy chọn: $i"
     ;;
   ("--orn"|"--pur"|"--red"|"--wht")
     printf '%s\n' "Tùy chọn: $i"
     ;;
   (*)
     printf '%s\n' "Tùy chọn không hợp lệ | Argm: $i"
     ;;
  thoát hiểm
 xong
bac0n avatar
lá cờ cn
Dấu ngoặc đơn bên trái không nên ở đó. Bạn cũng không cần phải trích dẫn mẫu, Nếu bạn không có ý định thao tác `$@` (tham số vị trí) thì không cần phải gán lại chúng cho một mảng khác. (trường hợp `"$i"` trong... nên được trích dẫn)
bac0n avatar
lá cờ cn
`printf 'Tùy chọn không hợp lệ: %s\n' "$i"`
lá cờ jp
Câu hỏi là về việc phát hiện các tùy chọn không hợp lệ xảy ra giữa các đối số tùy chọn hợp lệ.
bac0n avatar
lá cờ cn
Bạn vẫn sẽ phải sửa những gì tôi đã chỉ ra
lá cờ jp
Không bắt buộc phải sử dụng "$i" với `case`. Có, tôi chỉ có thể làm `for i in "$@"; làm`, phải không?
Điểm:1
lá cờ cn

Trong trường hợp này, có lẽ tốt nhất là chuyển đổi chiến lược và sự thay đổi các tùy chọn của bạn vì không có cách nào để có được vị trí danh sách trong vòng lặp for, điều này khiến cho việc kiểm tra các tùy chọn có giá trị gần như không thể:

#!/bin/bash

check_value(){
    ! [[ $1 = @(|-[!-]*|--[!-]*) ]]
}
expand_option(){
    cục bộ -n __a__=$2; cục bộ b=${1:1}
    [[ ! $b =~ [\ -] ]] && {
      [[ $b =~ ${b//?/(.)} ]] && { __a__=("${BASH_REMATCH[@]:1}"); __a__=("${__a__[@]/#/-}"); }
    } || trả lại 1
}

khai báo -a a=() b=()
khai báo -A O=()

trong khi (($# > 0)); làm
    trường hợp "$1" trong
    -[!-][!-]*)
        expand_option "$1" a || { \
        printf 'Mở rộng không hợp lệ: %s\n' "$1"; lối ra; }; đặt -- "${a[@]}" "${@:2}"
        tiếp tục
        ;;
     -[vuh])
        O[${1//-}]=1
        printf 'Tùy chọn 1: %s\n' "$1"
        ;;
    -[!-]*)
        printf 'Tùy chọn rút gọn không hợp lệ: %s\n' "$1"
        lối ra
        ;;
     --Cứu giúp)  ;&
     --cách sử dụng) ;&
     --verbosity)
        O[${1//-}]=1
        printf 'Tùy chọn 2: %s\n' "$1"
        ;;
     --vlt)
        check_value "$2" || { \
        printf "Giá trị không hợp lệ: '%s'\n" "$2"; lối ra; }
        O[${1//-}]=$2
        printf 'Giá trị cho %s: %s\n' "$1" "$2"
        sự thay đổi
        ;;
    --[!-]*)
        printf 'Tùy chọn dài không hợp lệ: %s\n' "$1"
        lối ra
        ;;
    --)
        b+=("${@:2}")
        nghỉ
        ;;
     *)
        b+=("$1")
        ;;
    thoát hiểm
    sự thay đổi
xong

echo Tùy chọn cuối cùng '${O[@]}':
cho k trong "${!O[@]}"; làm
    printf 'Khóa: %s, Giá trị: %s\n' "$k" "${O[$k]}"
xong

nếu ((${#b[@]} > 0)); sau đó
    printf 'Giá trị không xác định: %s\n' "${b[*]}"
fi

lá cờ jp
Việc sử dụng `;;` thay vì `;&` có còn làm điều tương tự không?
bac0n avatar
lá cờ cn
Tôi sẽ đưa ra một giải pháp khác với getopt ... `;&` hoạt động như một sự chuyển tiếp. Tôi nghĩ rằng nó làm cho nó dễ đọc hơn
lá cờ jp
Bạn không có ý định làm hỏng kế hoạch của mình, nhưng tôi đang tránh sử dụng `getopt` hoặc `getopts`. Tôi đã sử dụng chúng trước đây, nhưng tôi làm được nhiều thứ hơn những gì chúng hiện đang cung cấp.
bac0n avatar
lá cờ cn
quá phức tạp.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.