Shift: Есть ли глобальная версия?

Shift: Есть ли глобальная версия?

Для анализа списка аргументов я попытался реализовать общую схему анализа сверху вниз.

Я задавался вопросом, почему моя eat()функция не работает. Потому что позиционные аргументы $1, $2, $3, ... находятся в контексте этой конкретной функции. А не в контексте самого скрипта. Облом. Я еще не привык к bash.

Итак, мой вопрос заключается в следующем: если это верно, то область действия смещения также является контекстом моей eat()функции, да?

Неужели нет способа переместить аргументы скрипта изнутри другой функции? : (

[Это означает, что мне нужно реализовать ВСЮ логику (которая обычно соответствует нисходящим парсерам) в операторе case! (!?)]

решение1

Функция может возвращать все (или подмножество) переданных ей аргументов (например, через глобальный массив), а вызывающий скрипт может затем использовать это для установки своих собственных аргументов. Например:

#!/bin/bash

declare -a args

nofoo() {
  # we don't like "--foo", it is forbidden!
  for a in "$@"; do
    [ "$a" != "--foo" ] && args+=("$a")
  done
}

nofoo "$@"
set -- "${args[@]}"

Из help setbash:

набор:set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

Установка или отмена значений параметров оболочки и позиционных параметров.

Измените значение атрибутов оболочки и позиционных параметров или отобразите имена и значения переменных оболочки.

[...]

-- Назначьте оставшиеся аргументы позиционным параметрам. Если оставшихся аргументов нет, позиционные параметры сбрасываются.

Связанный контент