Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/bash/arg/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ Spec entries use `name|kind|token[|token...]`:
- each `token` is an exact option token, such as `--verbose` or `-v`.

The parser supports `--option value`, `--option=value`, repeated options where
the last value wins, and `--` to stop option parsing. Unknown options,
the last value wins, and `--` to stop option parsing. A value option followed by
another registered option token is treated as missing its value; use
`--option=value` when a value is intentionally option-like. Unknown options,
malformed specs, and missing values return status `2`.

## Tests
Expand Down
4 changes: 4 additions & 0 deletions lib/bash/arg/lib_arg.sh
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,10 @@ arg_parse() {
log_error "arg_parse: option '$__arg_option_token' requires a value."
return 2
fi
if [[ -n "${__arg_token_kind[$1]+set}" ]]; then
log_error "arg_parse: option '$__arg_option_token' requires a value before option '$1'."
return 2
fi

__arg_option_value="$1"
shift
Expand Down
16 changes: 16 additions & 0 deletions lib/bash/arg/tests/lib_arg.bats
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,22 @@ create_script() {
[ "$parse_status" -eq 2 ]
}

@test "arg_parse rejects registered options as missing option values" {
local -a specs=(
"verbose|flag|--verbose|-v"
"output|value|--output|-o"
)
local -A options=()
local -a positionals=()
local parse_status=0

arg_parse options positionals specs -- --output --verbose || parse_status=$?

[ "$parse_status" -eq 2 ]
[ -z "${options[output]+set}" ]
[ -z "${options[verbose]+set}" ]
}

@test "arg_parse rejects invalid variable names without echoing values" {
local script="$TEST_TMPDIR/arg-invalid-vars.sh"

Expand Down
Loading