On Fri, Jan 29, 2021 at 09:36:50PM +0100, Jilles Tjoelker wrote:
> If your actual code is more like:
>
> set -- -a foo -a bar # for testing
> while getopts :a: arg; do
> ...
>
> then the script violates the rule I mentioned, and has unspecified
> results.
This, of course, would be the intended use of such a technique.
Having read the a little more of the standard I may have come up with a
solution which both appears to work and without much ugliness. I hope
it also doesn't violate either the spirit or word of the standard on this
matter:
#!/bin/sh --
while getopts :a: arg; do
case $arg in
a) set -- "$@" attr="$OPTARG"; shift "$((OPTIND - 1))"; OPTIND=1
esac
done
shift "$((OPTIND - 1))"
It would be quite sad for me to lose this functionality.
P.S. To my amusement this works with bourne as well but shifting needs
to be undertaken with `expr "$OPTIND" - 1` instead.