parse arguments after getopts
You can do something like:
shift $(($OPTIND - 1))first_arg=$1second_arg=$2
after the loop has run.
To capture all the remaining parameters after the getopts
processing, a good solution is to shift
(remove) all the processed parameters (variable $OPTIND
) and assign the remaining parameters ($@
) to a specific variable.Short answer:
shift $(($OPTIND - 1))remaining_args="$@"
Long example:
#!/bin/bashverbose=falsefunction usage () { cat <<EOUSAGE$(basename $0) hvr:e: show usageEOUSAGE}while getopts :hvr:e: optdo case $opt in v) verbose=true ;; e) option_e="$OPTARG" ;; r) option_r="$option_r $OPTARG" ;; h) usage exit 1 ;; *) echo "Invalid option: -$OPTARG" >&2 usage exit 2 ;; esacdoneecho "Verbose is $verbose"echo "option_e is \"$option_e\""echo "option_r is \"$option_r\""echo "\$@ pre shift is \"$@\""shift $((OPTIND - 1))echo "\$@ post shift is \"$@\""
This will output
$ ./test-getopts.sh -r foo1 -v -e bla -r foo2 remain1 remain2Verbose is trueoption_e is "bla"option_r is " foo1 foo2"$@ pre shift is "-r foo1 -v -e bla -r foo2 remain1 remain2"$@ post shift is "remain1 remain2"