Я не парень по Linux, но застрял в каком-то скрипте, который я должен прочитать для своего проекта. Так кто-нибудь может мне помочь, что делает эта команда?
shift $(($optind - 1))
Я не парень по Linux, но застрял в каком-то скрипте, который я должен прочитать для своего проекта. Так кто-нибудь может мне помочь, что делает эта команда?
shift $(($optind - 1))
Ответы:
shift $((OPTIND-1))
(примечание OPTIND
в верхнем регистре) обычно находится сразу после getopts
while
цикла. $OPTIND
это количество вариантов найденных getopts
.
Как упоминает pauljohn32 в комментариях, строго говоря, OPTIND
дает позицию следующего аргумента командной строки.
Из Справочного руководства по GNU Bash :
имя опционной строки getopts [args]
getopts
используется сценариями оболочки для анализа позиционных параметров.optstring
содержит опционные символы, которые должны быть распознаны; если за символом следует двоеточие, ожидается, что параметр имеет аргумент, который должен отделяться от него пробелом. Двоеточие (':') и вопросительный знак ('?') Нельзя использовать в качестве дополнительных символов. Каждый раз, когда он вызывается,getopts
помещает следующую опцию в имя переменной оболочки, инициализируя,name
если она не существует, и индекс следующего аргумента, который будет обработан, в переменнуюOPTIND
.OPTIND
устанавливается в 1 каждый раз, когда вызывается оболочка или сценарий оболочки. Когда для опции требуется аргумент, getopts помещает этот аргумент в переменнуюOPTARG
. Оболочка не сбрасываетсяOPTIND
автоматически; он должен быть сброшен вручную между несколькими вызовами вgetopts
пределах одного вызова оболочки, если должен использоваться новый набор параметров.Когда встречается конец опций, происходит
getopts
выход с возвращаемым значением больше нуля.OPTIND
устанавливается на индекс первого неопционального аргумента, а имя устанавливается на '?'.
getopts
обычно анализирует позиционные параметры, но если дано больше аргументовargs
,getopts
вместо этого анализирует их.
shift
n
удаляет n строк из списка позиционных параметров. Таким образом shift $((OPTIND-1))
удаляет все параметры, которые были проанализированы getopts
из списка параметров, и поэтому после этой точки $1
будет ссылаться на первый не опциональный аргумент, переданный сценарию.
Обновить
Как упоминает mikeserv в комментарии, shift $((OPTIND-1))
может быть небезопасно. Чтобы предотвратить нежелательное расщепление слов и т. Д., Все расширения параметров должны быть заключены в двойные кавычки. Таким образом, безопасная форма для команды
shift "$((OPTIND-1))"
find
) могут выглядеть так, как будто они разрешают опции после неопций, но они этого не делают: у них есть операнды, начинающиеся с тире.
IFS
, но лучше быть в безопасности, чем потом сожалеть. ;)
IFS=0123456789
, shift $((OPTIND-1))
(без кавычек) превратится в, shift ""
который будет игнорироваться (in ksh
) или генерировать ошибку (in bash
и dash
).
$((...))
просто рассчитывает вещи. В вашем случае он принимает значение $optint
и вычитает 1.
shift
удаляет позиционные параметры. В вашем случае это удаляет optint-1
параметры.
Для получения дополнительной информации посмотрите на help getopts
, help shift
, взгляд на man bash
для «Арифметика расширения», и особенно Google для getopts
.