Getopts option processing, Est-il possible d'append un sans trait d'union?

J'utilise getopts pour tous mes scripts qui nécessitent une parsing avancée des options, et cela a bien fonctionné avec dash . Je suis familier avec l'utilisation standard de base de getopts , composée de [-x] et [-x OPTION] .

Est-il possible d'parsingr des options comme celle-ci?

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

Les arguments de script viennent généralement après les options. Jetez un oeil à d'autres commands telles que cp ou ls et vous verrez que c'est le cas.

Donc, pour gérer:

 dash_script.sh -x -z -o OPTION FILE 

vous pouvez utiliser getopts comme indiqué ci-dessous:

 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" 

Après avoir traité les options, getopts place $OPTIND sur l'index du premier argument non-option qui est dans ce cas FILE .

Getopt réarrangera les parameters et mettra tous les parameters non option à la fin, après -- :

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

Si vous avez vraiment besoin de savoir qu'un paramètre nonoption est au début, vous pouvez vérifier si $1 est une option, et si ce n'est pas le cas, avant d'appeler getopt :

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