Как я могу получить оставшиеся аргументы после извлечения разобранных предметов с помощью getopts?

14

Я хочу проанализировать некоторые аргументы скрипта bash, используя getopts, но хочу иметь возможность доступа к остальным аргументам, которые не включены в список опций. Так, например, если у меня есть звонок:

% script -a -b param -c param -d other arguments here

Я бы:

while getopts "ab:c:d" opt ; do
.
done

Какой самый простой способ получить «другие аргументы», которые не должны обрабатываться getopts?

Тим
источник

Ответы:

17

вам нужно сдвигаться, когда вы разбираете arg, или ставите

сдвиньте $ ((OPTIND -1)) после того, как вы закончили синтаксический анализ, затем действуйте обычным способом, например

while getopts "ab:c:d" opt ; do
.
done
shift $(expr $OPTIND - 1 )

while test $# -gt 0; do
  echo $1
  shift
done
pogma
источник
1
Стоит пояснить, что $ OPTIND - это индекс следующей опции, которая будет рассматриваться после запуска каждого getopts. Следовательно, $ * содержит 3 параметра, после первого действительного вызова - 2, а второго - 3. Если вызов недействителен, он выпадет с более ранним значением. Поэтому, если параметр 1 недействителен, OPTIND будет равен 1 (следовательно, приведенный выше пример будет shift $(expr 1 - 1)безопасным.
sibaz
0

В конце синтаксического анализа, как только вы сдвинули переменную $ @, в конце строки находится:

while getopts "ab:c:d" opt ; do
.
done
shift $((OPTIND-1))
OTHERARGS=$@
Бруно Майрло
источник