Рейтинг:0

Предупреждения о недопустимых именах параметров, которые встречаются между допустимыми именами параметров.

флаг jp

Я написал следующую часть bash, но мне нужно реализовать что-то более сложное.

Задача состоит в том, чтобы обнаружить недопустимый вариант только в том случае, если он встречается между известными вариантами.

Например, следующее myfunc -v -w --vlt «Убунту» напечатал бы

Неизвестная опция -w

Но myfunc -v --vlt -w "Убунту" не будет печатать никаких предупреждающих сообщений, потому что -w происходит после известных аргументов, не являющихся параметрами.

Код будет проверять только имена опций, начинающиеся с -. Таким образом myfunc -v -w 5 --vlt «Убунту» будет сообщать только о -w, игнорируя любые значения параметров для предупреждающих сообщений.

 для i в "$@"; делать
  случай $i в
   ("-v"|"--многословие"|"-u"|"--использование"|"-h"|"--help")
     printf '%s\n' "Опция: $i"
     ;;
   ("--vlt"|"--blu"|"--grn"|"--ylw")
     printf '%s\n' "Опция: $i"
     ;;
   ("--orn"|"--pur"|"--red"|"--wht")
     printf '%s\n' "Опция: $i"
     ;;
   (*)
     printf '%s\n' "Недопустимая опция | Аргумент: $i"
     ;;
  эсак
 сделано
bac0n avatar
флаг cn
Левых скобок быть не должно. Вам также не нужно заключать шаблон в кавычки. Если вы не собираетесь манипулировать `$@` (позиционными параметрами), нет необходимости повторно назначать их другому массиву. (случай `"$i"` в... должен быть заключен в кавычки)
bac0n avatar
флаг cn
`printf 'Недопустимая опция: %s\n' "$i"`
флаг jp
Вопрос заключается в обнаружении недопустимых параметров, которые встречаются между допустимыми аргументами параметров.
bac0n avatar
флаг cn
Вам все равно придется исправить то, что я указал
флаг jp
Использование "$i" с case не требуется. Да, я мог бы просто сделать `for i в "$@"; делай, да?
Рейтинг:1
флаг cn

В этом случае, наверное, лучше сменить стратегию и сдвиг ваши варианты, потому что нет способа получить позицию списка в цикле for, что делает практически невозможным проверку параметров со значением:

#!/бин/баш

проверить_значение(){
    ! [[ $1 = @(|-[!-]*|--[!-]*) ]]
}
расширить_опцию () {
    местный -n __a__=$2; местный b=${1:1}
    [[ ! $b =~ [\ -] ]] && {
      [[ $b =~ ${b//?/(.)} ]] && { __a__=("${BASH_REMATCH[@]:1}"); __a__=("${__a__[@]/#/-}"); }
    } || вернуть 1
}

объявить -a a=() b=()
объявить -A O=()

пока (($# > 0)); делать
    случай "$1" в
    -[!-][!-]*)
        expand_option "$1" || { \
        printf 'Недопустимое расширение: %s\n' "$1"; выход; }; установить -- "${a[@]}" "${@:2}"
        Продолжить
        ;;
     -[ух])
        О[${1//-}]=1
        printf 'Вариант 1: %s\n' "$1"
        ;;
    -[!-]*)
        printf 'Недопустимая короткая опция: %s\n' "$1"
        выход
        ;;
     --помощь)  ;&
     --Применение) ;&
     -- многословие)
        О[${1//-}]=1
        printf 'Вариант 2: %s\n' "$1"
        ;;
     --vlt)
        check_value "$2" || { \
        printf "Недопустимое значение: '%s'\n" "$2"; выход; }
        О[${1//-}]=$2
        printf 'Значение для %s: %s\n' "$1" "$2"
        сдвиг
        ;;
    --[!-]*)
        printf 'Недопустимая длинная опция: %s\n' "$1"
        выход
        ;;
    --)
        б+=("${@:2}")
        сломать
        ;;
     *)
        б+=("$1")
        ;;
    эсак
    сдвиг
сделано

echo Окончательные параметры '${O[@]}':
для k в "${!O[@]}"; делать
    printf 'Ключ: %s, Значение: %s\n' "$k" "${O[$k]}"
сделано

если ((${#b[@]} > 0)); тогда
    printf 'Неизвестные значения: %s\n' "${b[*]}"
фи

флаг jp
Будет ли использование `;;` вместо `;&` делать то же самое?
bac0n avatar
флаг cn
Я предложу другое решение с getopt ... `;&` действует как сквозной. Я думаю, это делает его более читабельным
флаг jp
Не хочу портить ваш план, но я избегаю использования `getopt` или `getopts`. Я использовал их раньше, но я делаю больше, чем то, что они в настоящее время предоставляют.
bac0n avatar
флаг cn
чрезмерно закомплексован.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.