Автоматический анализ параметров getopts в динамических переменных с тем же именем в bash - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть скрипт bash, который я написал, скажем, 3 параметра командной строки, bib, bob и boo ... и я хочу прочитать в пользовательских параметрах переменную bash с тем же именем, которую я делаю следующим образом:

PARSED_OPTIONS=$(getopt -n $0  --long "bib:,bob:,boo:"  -- "$@")

eval set -- "$PARSED_OPTIONS";

while true; do
  case "$1" in

  --bib)
  bib=$2
  shift 2;;

  --bob)
  bob=$2
  shift 2;;

  --boo)
  boo=$2
  shift 2 ;;

  --)
  shift
  break;;

  esac
done

Пока все отлично работает, так хорошо ...

Но теперь я хочу расширить это до списка из множества вариантов, и поэтому вместо того, чтобы выписыватьдлинное выражение case, было бы очень хорошо иметь возможность каким-то образом циклически перебирать список параметров и автоматически передавать параметры переменной, что-то вроде этих строк

opts="bib:,bob:,boo:," 

PARSED_OPTIONS=$(getopt -n $0  --long $opts -- "$@")

for arg in `echo $opts | tr , " "` ; do 
  eval set -- "$PARSED_OPTIONS";
  while true; do

    case "$1" in
      --${arg})
      declare $arg=$2
      shift 2
      ;;
      --)
      shift
      break;;
    esac
  done
done

Я использую оператор объявления дляполучить аргумент в динамическую переменную с тем же именем (см. Имена динамических переменных в Bash второе решение), и это решение сделать цикл по спискам через запятую Цикл через переменную оболочки через запятую но у меня тут бесконечный цикл.Я думаю, потому что 2 неиспользуемые опции позволяют, поскольку они находятся в списке PARSED_OPTIONS, но тогда они не обрезаются в цикле, так как ищется только «arg» ... Я не вижу очевидного пути обхода этого, ноЯ уверен, что есть один.

1 Ответ

0 голосов
/ 13 февраля 2019

Я понял, что у меня есть команда shift все еще внутри оператора case, поэтому он не завершился.Мне также нужно было удалить двоеточие: из аргумента, так что вот мой автоматический поиск аргументов для bash-скрипта, который работает:

# specify an arbitrary list of arguments:

opts=bib:,bob:,boo:

PARSED_OPTIONS=$(getopt -n $0  --long "${opts}"  -- "$@")

for arg in ${opts//,/ } ; do 
  var=${arg//:} # remove the colon
  eval set -- "$PARSED_OPTIONS";
  while true ; do
    case "$1" in
      --${var})
      declare ${var}=$2
      ;;
    --)
      break
      ;;
    esac
    shift 2
  done
done

Так что если вы попробуете test_script --boo 3 --bib hello -Боб lkkfrfrfr

echo $bib $bob $boo

должен дать

hello lkkfrfrfr 3
...