Matheus Tavares <matheus.bernardino@xxxxxx> writes: > - Added a check for bundles containing more than one "option that > requires args" (e.g. '-rr'), in which case we error-out. We could > interpret '-rr 1 2' as 'run tests 1 _and_ 2', but the unbundled > format, '-r 1 -r 2', is not currently interpreted like that (the last > just overrides the previous). So, for simplicity, let's only forbid > such bundles for now. Makes sense. I think this is the best we can do at this moment. > +opt_required_arg= > +# $1: option string > +# $2: name of the var where the arg will be stored > +mark_option_requires_arg () > +{ "{" on the same line, just like you did for parse_option below. > + if test -n "$opt_required_arg" > then > + echo "error: options that require args cannot be bundled" \ > + "together: '$opt_required_arg' and '$1'" >&2 > + exit 1 > fi > + opt_required_arg=$1 > + store_arg_to=$2 > +} > + > +parse_option () { > + local opt="$1" > ... > + case "$opt" in > + --*) > + parse_option "$opt" ;; I think J6t's suggestion to the previous round still has merit here. > + -?*) > + # bundled short options must be fed separately to parse_option > + opt=${opt#-} > + while test -n "$opt" > + do > + extra=${opt#?} Take the rest of the string after stripping the first one in $extra ... > + this=${opt%$extra} ... and then strip that tail part from the end, which would give the first letter in $this. > + opt=$extra And the next round will use the remainder after taking $this out of the bundled options from the front. Makes sense. > + parse_option "-$this" > + done Thanks