Для анализа списка аргументов я попытался реализовать общую схему анализа сверху вниз.
Я задавался вопросом, почему моя 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 set
bash:
набор:
set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
Установка или отмена значений параметров оболочки и позиционных параметров.
Измените значение атрибутов оболочки и позиционных параметров или отобразите имена и значения переменных оболочки.
[...]
--
Назначьте оставшиеся аргументы позиционным параметрам. Если оставшихся аргументов нет, позиционные параметры сбрасываются.