Как использовать вставленные значения с помощью getopts

У меня есть этот код bash в сочетании с getopts, и если я правильно понял getopts, OPTIND содержит индекс следующей опции командной строки, и все параметры командной строки, предоставленные сценарию оболочки, представлены в переменных $ 1, $ 2, $ 3 и т. Д. Исправьте меня, если Я ошибаюсь, но в основном та же концепция, что и локальные переменные в функциях.

Поэтому в соответствии с этим параметры [-a somevalue ] или [-b somevalue ] не дадут мне никаких результатов. Что я делаю не так?

 OPT_A=A OPT_B=B while getopts :a:b FLAG; do case $FLAG in a) OPT_A=$OPTARG ;; b) OPT_B=$OPTARG ;; esac done shift $((OPTIND-1)) while [ $# -ne 0 ]; do if [[ -z $OPT_A ]]; then if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots)."; exit 1; elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets)."; exit 1; else for OCTET in `echo $1 | tr '.' ' '`; do if ! [[ $OCTET =~ ^[0-9]+$ ]]; then echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric)."; exit 1; elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255)."; exit 1; fi done fi fi if [[ -z $OPT_B ]]; then if [[ "$2" =~ ^[0-9]+$ ]] && [ "$2" -ge 1 -a "$2" -le 10000 ]; then echo "chosen variable: $2"; exit 1; else echo "variable $2 is not in range '1 - 10000'"; exit 1; fi fi done exit 0 

3 Solutions collect form web for “Как использовать вставленные значения с помощью getopts”

Это связано с тем, что вся ваша логика зависит от одного из $OPT_[AB] являющегося нулевым. Но даже если вы не передадите параметр -[ab] $OPTARG , вы все еще устанавливаете их в верхней части скрипта с помощью OPT_[AB]=[AB] . Итак, ваши логические цепочки никогда не пройдут мимо корня …

 if [[ -z $OPT_A ]]; then... 

…заявление.

Ну … не вся ваша логика зависит от этого. Вы также делаете:

 shift $((OPTIND-1)) while [ $# -ne 0 ]... 

Поэтому, если вы передали script -a arg то getopts установили бы $OPT_A в arg а $OPTIND – до 3. Таким образом, вы shift 2 бы shift 2 (все ваши позиции), а затем сразу же провалили тест. Таким образом, ваше case установило бы $OPT_A а следующее, что произойдет, – exit 0 . Так что, я думаю, вы даже не $OPT_A бы проверить пустую $OPT_A .

И даже это будет нормально, так как большая часть вашей логики предназначена для проверки отказа, но ваш скрипт exit только с. Вероятно, вы используете $OPT_A var, но вы ничего не делаете с ним. Вы не можете использовать это значение после exit скрипта s – не без какого-либо предустановленного IPC, но здесь ничего подобного нет. Сценарий вызывается в подоболочке, а значения, которые он устанавливает, теряются, когда он возвращается к исходной оболочке.

Более того, optstring :a:b не позволяет использовать $OPTARG для -b . Ведущий двоеточие в optstring означает тихую операцию – он не пишет stderr если есть проблема с параметрами или их аргументами. Но двоеточие, завершающее символ опции, означает, что опция должна ожидать аргумент. Подобно:

 while getopts :a:b: FLAG 

… что указывает два варианта, которые ожидают аргументы. Это может быть сложно, потому что, если вы укажете, что предполагается принять аргумент, то если getopts находит его без него, он помещает его как ошибку:

 sh -c 'getopts :a:b: opt -a; echo "$opt $OPTARG"' 

… который печатает …

 : a 

В этом случае опция завершается в $OPTARG а : завершается в $opt . Яснее, если мы меньше : тихо об этом:

 sh -c 'getopts a:b: opt -a; echo "$opt $OPTARG"' No arg for -a option 

Итак, вам нужно проверить : для двоеточия и для ? – это еще один тип ошибок и который обычно перенаправляется для печати некоторых коротких вещей.

Лично я бы удостоверился, что $OPT_[AB] были пустыми, чтобы начать с них, сделать некоторую логику правильной их настройки и, когда с помощью тестового цикла, сделать мой последний тестовый для нулевого значения. Если у них нет какой-либо ценности, то это должно быть по какой-то причине я не обрабатывал, и это ошибка независимо. Вот начало того, как я буду работать над этим циклом тестирования …

 param_err(){ set '' "$@" : "${1:?Parameter '$OPTARG' does not look like an IP Address $2}" } test_oct(){ oIFS=$IFS; unset "${IFS+o}oIFS"; IFS=. for oct in $1; do [ $oct -lt 256 ] || param_err "('$oct' too large)" done; unset IFS oct : "${oIFS+${IFS=$oIFS}}" } a_param() case ${1##*.*.*.*.*} in (a) OPT_A=A;; #some default - no arg provided (.*|*..*|*.) param_err '(empty octet)';; (*[!.0-9]*) param_err '(octet is not positive integer)';; (*.*.*.*) test_oct "$1"; OPT_A=$1;; (*?*) param_err '(too few octets)';; (*) param_err ${1:+"(too many octets)"} '(null param)';; esac unset OPT_A OPT_B while getopts :a:b:c:d: opt do case ${opt#:}$OPTARG in a*) a_param "$OPTARG";; b*) b_param "$OPTARG";; #tests as needed similar to a_param() ?*) help;; #param_err should call this too, but it just exits esac done 

У вас нет линии shebang наверху, поэтому оболочка, которую вы используете ( sh , dash ), скорее всего, не поддержит [[ . Вы должны запустить скрипт с помощью:

 #!/bin/bash 

или любое другое местоположение bash находится в маловероятном случае, если это не путь к bash в вашей системе ( type bash ).

Попробуйте изменить это: while getopts: a: b FLAG; делать

К этому: while getopts: a: b: FLAG; делать

  • Рекурсивно создавать каталоги для всех букв
  • Чтение переменных без bash из файла в скрипт bash
  • Постоянное обновление переменной в фоновом режиме
  • извлекать линии в соответствии с конкретным столбцом
  • Как включить защиту от температуры процессора
  • Команда одиночной строки для протоколирования IP-адресов
  • grep и умножить определенные столбцы
  • Аргументы сценария Bash не передаются функции?
  • Найти и для цикла
  • Как использовать 'в псевдониме?
  • Условно включить этап трубы в сценарии bash
  • Interesting Posts

    Каковы все способы создания подоболочки в bash?

    попытался создать дубликата пользователя root, больше не может подключаться к серверу

    Поиск файла и исключение строк с указанной строкой

    Возможность использования ОС с открытым исходным кодом, совместимого с OS X?

    Инструменты для вывода записей из произвольных наборов файлов журналов между двумя датами

    посетить все каталоги под управлением версий

    Сравните 1-й столбец 1-го файла и 2-й столбец второго файла и получите результат следующим образом

    Командный прогон не тот, который возвращается командой `which`

    Есть ли способ улучшить Putty на медленных соединениях?

    неудача входа из-за неисправности оболочки

    Любой способ перечислить беспроводных клиентов в диапазоне

    `who am i` после` su` не показывает новый идентификатор пользователя?

    Зашифрованный раздел LVM без таблицы разделов

    Служба CentOS – cron умирает каждые несколько дней

    Magic Mouse 2 на Linux

    Linux и Unix - лучшая ОС в мире.