testfunc() {
printf -v args_str '%q ' "$@"
while (( $# )) && [[ $1 = -* ]]; do
arg=${1#-}; shift
while [[ $arg ]]; do
case $arg in
l*) flag_l=1; arg=${arg#l};;
u*) flag_u=1; arg=${arg#u};;
w*)
flag_w=1
rest=${arg#w}
if [[ -z $rest ]]; then
arg=$1; shift; rest=$arg
fi
if [[ $rest =~ ^([[:digit:]]+)(.*) ]]; then
w_value=${BASH_REMATCH[1]}
arg=${BASH_REMATCH[2]}
else
echo "ERROR: -w not followed with a number" >&2
exit 1
fi
;;
*) echo "Unrecognized flag: $arg" >&2; exit 1;;
esac
done
done
echo "After parsing $args_str"
echo "flag_w = ${flag_w:-0}"
echo "flag_l = ${flag_l:-0}"
echo "flag_u = ${flag_u:-0}"
echo "w_value = ${w_value:-0}"
}
testfunc -w42l
testfunc -w 42 -l
dGVzdGZ1bmMoKSB7CnByaW50ZiAtdiBhcmdzX3N0ciAnJXEgJyAiJEAiCndoaWxlICgoICQjICkpICYmIFtbICQxID0gLSogXV07IGRvCiAgYXJnPSR7MSMtfTsgc2hpZnQKICB3aGlsZSBbWyAkYXJnIF1dOyBkbwogICAgY2FzZSAkYXJnIGluCiAgICAgIGwqKSBmbGFnX2w9MTsgYXJnPSR7YXJnI2x9OzsKICAgICAgdSopIGZsYWdfdT0xOyBhcmc9JHthcmcjdX07OwogICAgICB3KikKICAgICAgICBmbGFnX3c9MQogICAgICAgIHJlc3Q9JHthcmcjd30KICAgICAgICBpZiBbWyAteiAkcmVzdCBdXTsgdGhlbgogICAgICAgICAgYXJnPSQxOyBzaGlmdDsgcmVzdD0kYXJnCiAgICAgICAgZmkKICAgICAgICBpZiBbWyAkcmVzdCA9fiBeKFtbOmRpZ2l0Ol1dKykoLiopIF1dOyB0aGVuCiAgICAgICAgICB3X3ZhbHVlPSR7QkFTSF9SRU1BVENIWzFdfQogICAgICAgICAgYXJnPSR7QkFTSF9SRU1BVENIWzJdfQogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkVSUk9SOiAtdyBub3QgZm9sbG93ZWQgd2l0aCBhIG51bWJlciIgPiYyCiAgICAgICAgICBleGl0IDEKICAgICAgICBmaQogICAgICAgIDs7CiAgICAgICopIGVjaG8gIlVucmVjb2duaXplZCBmbGFnOiAkYXJnIiA+JjI7IGV4aXQgMTs7CiAgICBlc2FjCiAgZG9uZQpkb25lCgplY2hvICJBZnRlciBwYXJzaW5nICRhcmdzX3N0ciIKZWNobyAiZmxhZ193ID0gJHtmbGFnX3c6LTB9IgplY2hvICJmbGFnX2wgPSAke2ZsYWdfbDotMH0iCmVjaG8gImZsYWdfdSA9ICR7ZmxhZ191Oi0wfSIKZWNobyAid192YWx1ZSA9ICR7d192YWx1ZTotMH0iCn0KCnRlc3RmdW5jIC13NDJsCnRlc3RmdW5jIC13IDQyIC1s