argbash
argbash copied to clipboard
Design better boolean arguments
Currently, the ARG_OPTIONAL_BOOL does not behave optimally (see #2 ).
It seems to be a good idea to have more macros for switch-on, switch-off and both (as the current ARG_OPTIONAL_BOOL somehow attempts to).
Currently, ARG_OPTIONAL_BOOL assumes that one wants to switch something on (using long and short option) and autogenerating long option to switch something off. This falls on its head when one wants to switch something off.
Proposed behavior:
ARG_OPTIONAL_BOOLwill remain, it will autodetect whether it is in a switch-on or switch-off mode by examining the default (or the option whether it begins withno-..., I'm not yet decided). It will use the provided long and short options for the detected mode, but it will also generate a long option for the opposite mode.- Occurence of
ARG_OPTIONAL_BOOL(no-video, v)would make the script accept--no-video,-v, that would set_arg_video(which would beonby default) tooff, and--video, that would set_arg_videotoon, overriding possible previous occurence of-vor--no-video. - Conversely, occurence of
ARG_OPTIONAL_BOOL(video, v)would make the script accept--video,-v, that would set_arg_video(which would beoffby default) toon, and--no-video, that would set_arg_videotooff, overriding possible previous occurence of-vor--video.
- Occurence of
New macros would be introduced:
ARG_OPTIONAL_SWITCH_ONwill be introduced. It will accept long and short option (and no default sinceoffwill be assumed as default).- Occurence of
ARG_OPTIONAL_SWITCH_ON(video, v)would make the script accept--video,-v, that would set_arg_video(which would beoffby default) toon.
- Occurence of
ARG_OPTIONAL_SWITCH_OFFwill be introduced. It will accept long and short option (and no default sinceonwill be assumed).- Occurence of
ARG_OPTIONAL_SWITCH_OFF(no-video, v)would make the script accept--no-video,-v, that would set_arg_video(which would beonby default) tooff. Everybody's comments are highly appreciated!
- Occurence of
After re-reading, so the only point of ARG_OPTIONAL_BOOL generating the negating option is overriding a possible previous occurence in the current args?
I can see the code being a bit cleaner using the proposed ARG_OPTIONAL_SWITCH_XXX behavior, but maybe not that intuitive to use. I would probably expect ARG_OPTIONAL_SWITCH_OFF(no-video, v) resulting in a _arg_no_video var.
Good point, (any) code should read like a prose, so letting ARG_OPTIONAL_SWITCH_OFF(video, v) to create the --no-video option while saving the result to _arg_video should do the trick. There could be an option to set the prefix (default would be no-, people may be interested in disable- for --disable-video etc.).
Hello! Is this still in the plans? The milestone is 2.7.0, but 2.8.0 got released a month ago. It's what would make argbash perfect for me.
Hello, yes, it is deffinitelly planned. Stay tuned for updates!
@matejak: Hi, will this issue be resolved? Seems like you got pretty far on your draft. Thanks
It would also be very helpful to have a way to integrate with arithmetic condition (( expression )) in modern Bash, which returns successfully (status 0) when expression evaluates to nonzero, or else returns failure (status 1).
Something like ARG_OPTIONAL_BOOL_NUM, ARG_SWITCH_YES_NUM, ARG_SWITCH_NO_NUM would be great.
Here's the behavior of Bash arithmetic conditional construct:
$ if (( 1 )); then echo yes; else echo no; fi
yes
$ if (( 0 )); then echo yes; else echo no; fi
no
$ if (( "" )); then echo yes; else echo no; fi
no
$ if (( )); then echo yes; else echo no; fi
no
$ unset foo; if (( foo )); then echo yes; else echo no; fi
no
$ foo=2; if (( foo )); then echo yes; else echo no; fi
yes
$ foo=2; if (( $foo )); then echo yes; else echo no; fi
yes
$ foo=2; if (( "$foo" )); then echo yes; else echo no; fi
yes