A followup on Bash long options.
The top-level option parsing while
-loop I discussed works fine
for regular options. Sometimes you need special parsing for subcommand
options. A hypothetical example might be:
$ my-script --toplevel-thing my-subcommand --something-wonderful option-arg
Here the --toplevel-thing
option is for my-script
,
and --something-wonderful
option and its
option-arg is for my-subcommand
. Regular
getopts
parsing will try to handle all options for the top
level, failing to distinguish subcommand options as separate. Further,
getopts
in a function does not behave quite as expected.
One solution is simple and hearkens back to the pre-getopts
days. For the top level:
while (( 0 < $# )) do case $1 in --toplevel-thing ) _toplevel_thing=true ; shift ;; -* ) usage >&2 ; exit 2 ;; * ) break ;; esac done
Using a while
-loop with explicit breaks avoids looking too far
along the command line, and wrongly consuming options meant for
subcommands. Rechecking $#
each time through the loop breaks
gracefully. Similarly, for subcommands expressed in a function:
function my-subcommand { while (( 0 < $# )) do case $1 in --something-special ) local option_arg="$2" ; shift 2 ;; * ) usage >&2 ; exit 2 ;; esac done # Rest of my-subcommand, using `option_arg` if provided
This uses the same pattern as the top level so you avoid needing to remember to handle top level one way, and subcommand another.
An example script using this pattern.
No comments:
Post a Comment