Это не имеет ничего общего с косой чертой. getopts
останавливает обработку параметров, когда доходит до первого аргумента, который не начинается с -
. Это задокументированное поведение:
Когда встречается конец опций, getopts
завершается с возвращаемым значением больше нуля. OPTIND
устанавливается в качестве индекса первого неопционального аргумента, а name устанавливается в ?
.
Ваше утверждение, что оно работает при использовании
./script f1 f2 -r
просто неправильно. Я добавил echo $RECURSIVE_FLAG
в конец вашего скрипта, и когда я запустил его таким образом, он повторил 0
.
Если вы хотите разрешить более либеральный синтаксис, с опциями после имен файлов (например, GNU rm
), вам нужно выполнить собственный анализ аргументов. Поместите вашу петлю getopts
в другую петлю. Когда цикл getopts
заканчивается, вы можете сделать:
# Find next option argument
while [[ $OPTIND <= $# && ${!OPTIND} != -* ]]; do
((OPTIND++))
done
# Stop when we've run out of arguments
if [[ $OPTIND > $# ]]; then
break
fi