From 2c127f4d5a82ccef6996c3179d627f769da83dd9 Mon Sep 17 00:00:00 2001 From: Ramesh Padmanabhaiah Date: Wed, 24 Jun 2026 19:18:04 -0700 Subject: [PATCH] Reject option tokens as arg values --- lib/bash/arg/README.md | 4 +++- lib/bash/arg/lib_arg.sh | 4 ++++ lib/bash/arg/tests/lib_arg.bats | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/bash/arg/README.md b/lib/bash/arg/README.md index f1f69d4..d821c23 100644 --- a/lib/bash/arg/README.md +++ b/lib/bash/arg/README.md @@ -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 diff --git a/lib/bash/arg/lib_arg.sh b/lib/bash/arg/lib_arg.sh index f270b94..7c6b424 100644 --- a/lib/bash/arg/lib_arg.sh +++ b/lib/bash/arg/lib_arg.sh @@ -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 diff --git a/lib/bash/arg/tests/lib_arg.bats b/lib/bash/arg/tests/lib_arg.bats index e3201a1..b3bf10b 100644 --- a/lib/bash/arg/tests/lib_arg.bats +++ b/lib/bash/arg/tests/lib_arg.bats @@ -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"