From 87ee38d8b3d155310d13e2539e8647a98115df80 Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Tue, 5 Jul 2011 19:01:22 +1000 Subject: [PATCH] parse_options: implement optional arguments This allows options specified with a trailing "::" to optionally take arguments. Signed-off-by: Allan McRae Signed-off-by: Dan McGee --- scripts/library/parse_options.sh | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/scripts/library/parse_options.sh b/scripts/library/parse_options.sh index 96222301..49cbb60f 100644 --- a/scripts/library/parse_options.sh +++ b/scripts/library/parse_options.sh @@ -17,7 +17,12 @@ parse_options() { fi done if [[ -n $match ]]; then - if [[ ${1:2} = $match ]]; then + local needsargument=0 + + [[ ${match} = ${1:2}: ]] && needsargument=1 + [[ ${match} = ${1:2}:: && -n $2 && ${2:0:1} != "-" ]] && needsargument=1 + + if (( ! needsargument )); then printf ' %s' "$1" else if [[ -n $2 ]]; then @@ -40,7 +45,15 @@ parse_options() { elif [[ ${1:0:1} = '-' ]]; then for ((i=1; i<${#1}; i++)); do if [[ $short_options =~ ${1:i:1} ]]; then - if [[ $short_options =~ ${1:i:1}: ]]; then + local needsargument=0 + + [[ $short_options =~ ${1:i:1}: && ! $short_options =~ ${1:i:1}:: ]] && needsargument=1 + [[ $short_options =~ ${1:i:1}:: && \ + ( -n ${1:$i+1} || ( -n $2 && ${2:0:1} != "-" ) ) ]] && needsargument=1 + + if (( ! needsargument )); then + printf ' -%s' "${1:i:1}" + else if [[ -n ${1:$i+1} ]]; then printf ' -%s' "${1:i:1}" printf " '%s'" "${1:$i+1}" @@ -55,8 +68,6 @@ parse_options() { fi fi break - else - printf ' -%s' "${1:i:1}" fi else echo "@SCRIPTNAME@: $(gettext "unrecognized option") '-${1:i:1}'" >&2