7

I'm using getopts for all of my scripts that require advanced option parsing, and It's worked great with dash. I'm familiar with the standard basic getopts usage, consisting of [-x] and [-x OPTION].

Is it possible to parse options like this?

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

2 Answers 2

7

Script arguments usually come after options. Take a look at any other commands such as cp or ls and you will see that this is the case.

So, to handle:

dash_script.sh -x -z -o OPTION FILE

you can use getopts as shown below:

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"

After processing the options, getopts sets $OPTIND to the index of the first non-option argument which in this case is FILE.

2
  • I'm going to test this one out, looks like a good implementation. Jan 25, 2012 at 2:51
  • This is perfect, exactly how I would want the options to go! Thanks for all your help! Jan 26, 2012 at 1:59
2

Getopt will rearrange the parameters and put all non option parameters at the end, after --:

$ getopt -o a: -- nonoption-begin -a x nonoption-middle -a b nonoption-end
-a 'x' -a 'b' -- 'nonoption-begin' 'nonoption-middle' 'nonoption-end'

If you really need know that a nonoption parameter is at the beginning, you can check whether $1 is an option, and if it isn't extract it, before you call getopt:

if [ ${1#-} = $1 ]; then
  NONOPTION=$1
  shift
fi
ARGS=$(getopt ...)
1
  • Although my answer was about getopt (not getopts), I'll leave it because the part about extracting the first parameter is still valid.
    – angus
    Jan 24, 2012 at 9:44

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .