Puncte:0

Avertismente despre nume de opțiuni nevalide care apar între nume de opțiuni valide

drapel jp

Am scris următoarea piesă bash, dar trebuie să implementez ceva mai complicat.

Sarcina este de a detecta o opțiune nevalidă numai dacă se întâmplă între opțiunile cunoscute.

De exemplu, următoarele myfunc -v -w --vlt „Ubuntu” ar tipări

Opțiune necunoscută -w

Dar myfunc -v --vlt -w „Ubuntu” nu ar imprima niciun mesaj de avertizare deoarece -w apare după argumentele non-opțiuni cunoscute.

Codul ar verifica numai numele opțiunilor care încep cu -. Astfel myfunc -v -w 5 --vlt „Ubuntu” ar raporta doar despre -w, ignorând orice valoare a opțiunii pentru mesajele de avertizare.

 pentru i în „$@”; do
  cazul $i in
   ("-v"|"--verbosity"|"-u"|"--usage"|"-h"|"--help")
     printf '%s\n' "Opțiune: $i"
     ;;
   ("--vlt"|"--blu"|"--grn"|"--ylw")
     printf '%s\n' "Opțiune: $i"
     ;;
   ("--orn"|"--pur"|"--red"|"--wht")
     printf '%s\n' "Opțiune: $i"
     ;;
   (*)
     printf '%s\n' "Opțiune nevalidă | Argm: $i"
     ;;
  esac
 Terminat
bac0n avatar
drapel cn
Parantezele din partea stângă nu ar trebui să fie acolo. Nici nu trebuie să citați modelul, dacă nu aveți intenția de a manipula `$@` (parametri de poziție) nu este nevoie să-i reatribuiți unei alte matrice. (cazul `"$i"` în... ar trebui totuși citat)
bac0n avatar
drapel cn
`printf 'Opțiune nevalidă: %s\n' "$i"`
drapel jp
Întrebarea este despre detectarea opțiunilor nevalide care apar între argumentele opțiunilor valide.
bac0n avatar
drapel cn
Tot va trebui să repari ceea ce am subliniat
drapel jp
Utilizarea „$i” cu `case` nu este necesară. Da, aș putea face pur și simplu `for i în „$@”; face, nu?
Puncte:1
drapel cn

În acest caz, probabil cel mai bine este să schimbați strategia și schimb opțiunile dvs. deoarece nu există nicio modalitate de a obține poziția listei într-o buclă for, ceea ce face aproape imposibilă verificarea opțiunilor cu o valoare:

#!/bin/bash

check_value(){
    ! [[ $1 = @(|-[!-]*|--[!-]*) ]]
}
expand_option(){
    local -n __a__=$2; local b=${1:1}
    [[ ! $b =~ [\ -] ]] && {
      [[ $b =~ ${b//?/(.)} ]] && { __a__=("${BASH_REMATCH[@]:1}"); __a__=("${__a__[@]/#/-}"); }
    } || întoarce 1
}

declara -a a=() b=()
declara -A O=()

în timp ce (($# > 0)); do
    cazul „$1” în
    -[!-][!-]*)
        expand_option „$1” a || { \
        printf „Extindere nevalidă: %s\n” „$1”; Ieșire; }; set -- „${a[@]}” „${@:2}”
        continua
        ;;
     -[vuh])
        O[${1//-}]=1
        printf „Opțiune 1: %s\n” „$1”
        ;;
    -[!-]*)
        printf „Opțiune scurtă nevalidă: %s\n” „$1”
        Ieșire
        ;;
     --Ajutor)  ;&
     --utilizare) ;&
     --verbositate)
        O[${1//-}]=1
        printf „Opțiunea 2: %s\n” „$1”
        ;;
     --vlt)
        check_value „$2” || { \
        printf "Valoare nevalidă: '%s'\n" "$2"; Ieșire; }
        O[${1//-}]=$2
        printf „Valoare pentru %s: %s\n” „$1” „$2”
        schimb
        ;;
    --[!-]*)
        printf „Opțiune lungă nevalidă: %s\n” „$1”
        Ieșire
        ;;
    --)
        b+=(„${@:2}”)
        pauză
        ;;
     *)
        b+=(„$1”)
        ;;
    esac
    schimb
Terminat

echo Opțiuni finale „${O[@]}”:
pentru k în „${!O[@]}”; do
    printf „Cheie: %s, Valoare: %s\n” „$k” „${O[$k]}”
Terminat

dacă ((${#b[@]} > 0)); atunci
    printf „Valori necunoscute: %s\n” „${b[*]}”
fi

drapel jp
Folosirea „;;” în loc de „;&” ar face în continuare același lucru?
bac0n avatar
drapel cn
Voi ieși cu o altă soluție cu getopt... `;&` acționează ca un pass-through. Cred că o face mai lizibilă
drapel jp
Nu intenționați să vă stricați planul, dar evit să folosesc `getopt` sau `getopts`. Le-am folosit înainte, dar fac mai multe lucruri decât ceea ce oferă în prezent.
bac0n avatar
drapel cn
excesiv de complexat.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.