Getopts option processing, Is it possible to add a non hyphenated [FILE]?
Solution 1
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
.
Solution 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 ...)
Related videos on Youtube
J. M. Becker
Updated on September 18, 2022Comments
-
J. M. Becker over 1 year
I'm using
getopts
for all of my scripts that require advanced option parsing, and It's worked great withdash
. I'm familiar with the standard basicgetopts
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
-
angus over 12 yearsAlthough my answer was about getopt (not getopts), I'll leave it because the part about extracting the first parameter is still valid.
-
J. M. Becker over 12 yearsI'm going to test this one out, looks like a good implementation.