Обработка опций Getopts, возможно ли добавить не переносимый ?

Я использую getopts для всех моих скриптов, которые требуют расширенного анализа параметров, и он отлично работает с dash . Я знаком со стандартным базовым использованием getopts , состоящим из [-x] и [-x OPTION] .

Можно ли анализировать такие варианты?

  dash_script.sh FILE -x -z -o OPTION ## Or the inverse? dash_script.sh -x -z -o OPTION FILE 

Аргументы скрипта обычно появляются после параметров. Взгляните на любые другие команды, такие как cp или ls и вы увидите, что это так.

Итак, для обработки:

 dash_script.sh -x -z -o OPTION FILE 

вы можете использовать getopts как показано ниже:

 while getopts xzo: option do case "$option" in x) echo "x";; z) echo "z";; o) echo "o=$OPTARG";; esac done shift $(($OPTIND-1)) FILE="$1" 

После обработки опций getopts устанавливает $OPTIND в индекс первого необязательного аргумента, который в этом случае является FILE .

Getopt изменит параметры и поместит все необязательные параметры в конце, после -- :

 $ getopt -oa: -- nonoption-begin -ax nonoption-middle -ab nonoption-end -a 'x' -a 'b' -- 'nonoption-begin' 'nonoption-middle' 'nonoption-end' 

Если вам действительно нужно знать, что параметр nonoption находится в начале, вы можете проверить, является ли параметр $1 , и если он не извлекает его, прежде чем вы вызываете getopt :

 if [ ${1#-} = $1 ]; then NONOPTION=$1 shift fi ARGS=$(getopt ...)