2015-03-06 10 views
-1

У меня есть существующий скрипт, который работает на $ 1 $ 2 $ 3 и т. Д. Я хочу добавить необязательный аргумент, не нарушая порядок.Параметры не анализируются как аргумент в Unix

У нас есть готовое решение для: Если найден правильный параметр (с использованием getopts), этот индекс аргумента не следует рассматривать как аргумент.

+0

Хм, не совсем понятно - вы можете предоставить фрагмент код? как описано, вы просто проверили бы «$ 4» - но вы всегда будете вызывать скрипт с новым аргументом в 4-й позиции ... Если getopts в использовании, то это может иметь значение (например, скрипт «barfs» на вашем новом параметре с ошибкой –

+0

Проверить количество опций 'if [$ # -lt 4]; then ...; elif [$ # -eq 4]; then ...; else ...; fi' Хотя он должен быть хрупким. – economy

+0

Причины для downvote, пожалуйста? –

ответ

3

Обычное решение состоит в использовании getopts для сканирования и обработки дополнительных опций флага, а затем выполнить команду:

shift $((OPTIND-1)) 

Когда getopts отделки, $OPTIND будет число из первых пока еще необработанный аргумент. Команда shift удаляет первые OPTIND-1 аргументов, которые эффективно перенумеровывает необработанные параметры $1, $2, ....

1

Типичный подход при не с помощью getopts является петлей, пока первый элемент не параметр не видно:

while [[ $1 = -* ]]; do 
    # handle $1 here 
    shift 
done 

foo=$1 
bar=$2 
baz=$3 

Если параметр принимает сам аргумент (--directory /somewhere), то вам просто необходимо shift дополнительный экземпляр.

+1

Приятно, но фраза «берет больше опций сама по себе» немного запутанна, что вариант не является другим _option_, а [option] _argument_. – mklement0

+1

@ mklement0 , действительно, спасибо. –