getopts не получает аргументов, когда функция вызывается внутри цикла while

Обычно 32-разрядный процессор -может адресовать ровно 4 ГБ физического адресного пространства. Это включает в себя не только реальную оперативную память, но и такие вещи, как видеопамять видеоадаптера, если она отображается на системной шине. Некоторые другие -надстройки с высокой пропускной способностью -также могут иметь отображаемые в память -буферы.

PAE — это технология, позволяющая 32-разрядным -разрядным системам использовать более 4 ГБ памяти. Он делает это, добавляя еще один уровень в иерархию таблицы страниц процессора, что фактически делает все обращения к памяти немного более сложными.

Если у вас старый 32-разрядный -процессор с объемом памяти менее 4 ГБ, использование PAE, когда в нем нет необходимости, только снизит производительность. Эффект может быть небольшим,но он есть -, и со старым медленным процессором вам понадобится вся возможная скорость.

Включение PAE требует, чтобы структуры управления внутренней памятью ядра были расположены по-другому, так что это не то, что вы можете просто включать и выключать во время работы системы -, поэтому часто существуют отдельные пакеты ядра для PAE. и не -PAE.

3
18.09.2020, 15:04
1 ответ

Это потому, что вы не сбрасываете OPTIND. Согласно руководству:

Each time it is invoked, getopts places the next option in the shell variable name, initializing name if it does not exist, and the index of the next argument to be processed into the variable OPTIND. OPTIND is initialized to 1 each time the shell or a shell script is invoked.

Таким образом, OPTIND используется для отслеживания следующего аргумента для обработки и автоматически устанавливается в 1при запуске вашего скрипта, но НЕ сбрасывается при завершении вашей функции.

Чтобы исправить ваш скрипт, просто добавьте OPTIND=1в начало вашей функции:

function add_external_service() {
  OPTIND=1
  local local_service_name=""
  local external_service_name=""
  local external_service_namespace=""
  local service_url=""

  echo "    Options: $@"
  while getopts l:s:n:-: OPT; do
    if [[ "$OPT" = "-" ]]; then   # long option: reformulate OPT and OPTARG
      OPT="${OPTARG%%=*}"         # extract long option name
      OPTARG="${OPTARG#$OPT}"     # extract long option argument (may be empty)
      OPTARG="${OPTARG#=}"        # if long option argument, remove assigning `=`
    fi
    case "$OPT" in
      l | local-service-name)           needs_arg; local_service_name="$OPTARG" ;;
      s | external-service-name)        needs_arg; external_service_name="$OPTARG" ;;
      n | external-service-namespace)   needs_arg; external_service_namespace="$OPTARG" ;;
      external-name)                    needs_arg; service_url="$OPTARG" ;;
      ??* )                             die "Illegal option --$OPT" ;;  # bad long option
      \? )                              exit 2 ;;  # bad short option (error reported via getopts)
    esac
  done

  echo "      - local $local_service_name"
  echo "      - name $external_service_name"
  echo "      - namespace $external_service_namespace"
  echo "      - url $service_url"
}
4
18.03.2021, 23:04

Теги

Похожие вопросы