Когда вызывается getopt
, он отслеживает обработанные параметры с помощью переменной OPTIND
.
Попробуйте следующее:
#!/bin/bash
f () {
printf "Intro OPTIND: %d\n" "$OPTIND"
while getopts ":a:b:" opt; do
printf "Current OPTIND: %d\n" "$OPTIND"
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
b)
echo "-b was triggered, Parameter: $OPTARG" >&2
;;
esac
done
printf "Exit OPTIND: %d\n" "$OPTIND"
}
echo "Run #1"
f "$@"
echo "Run #2"
f "$@"
Выход:
./test -a foo -b bar
Run #1
Intro OPTIND: 1
Current OPTIND: 3
-a was triggered, Parameter: foo
Current OPTIND: 5
-b was triggered, Parameter: bar
Exit OPTIND: 5
Run #2
Intro OPTIND: 5
Exit OPTIND: 5
Таким образом, вы можете сделать что-то вроде:
OPTIND=1
в начале функции. Или, в зависимости от ситуации, что обычно лучше:
local OPTIND
Если OPTIND
не использовался, поскольку функция реализована, цикл while продолжался бы вечно. Его также можно использовать для возобновления обработки аргументов, после сбоя или чего-либо еще, вызвать другую функцию, если x или y, и она возобновит работу с того места, где было остановлено ранее и т. Д.