As @Ansgar points out, the argument to your option is stored in ${OPTARG}
, but this is not the only thing to watch out for when using getopts
inside a function. You also need to make sure that ${OPTIND}
is local to the function by either unsetting it or declaring it local
, otherwise you will encounter unexpected behaviour when invoking the function multiple times.
t.sh
:
#!/bin/bash
foo()
{
foo_usage() { echo "foo: [-a <arg>]" 1>&2; exit; }
local OPTIND o a
while getopts ":a:" o; do
case "${o}" in
a)
a="${OPTARG}"
;;
*)
foo_usage
;;
esac
done
shift $((OPTIND-1))
echo "a: [${a}], non-option arguments: $*"
}
foo
foo -a bc bar quux
foo -x
Example run:
$ ./t.sh
a: [], non-option arguments:
a: [bc], non-option arguments: bar quux
foo: [-a <arg>]
If you comment out # local OPTIND
, this is what you get instead:
$ ./t.sh
a: [], non-option arguments:
a: [bc], non-option arguments: bar quux
a: [bc], non-option arguments:
Other than that, its usage is the same as when used outside of a function.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…