The following produces a `bash: test: too many arguments` exception in `test`, 
with exit status 2:

``` bash
v='>'
test -n "$v" -a yes '!=' no # bash: test: too many arguments
echo $? # 2

test -n '>' -a 1 -eq 1 # bash: test: too many arguments
echo $? # 2

[ -n '>' -a 1 -eq 1 ] # bash: [: too many arguments
echo $? # 2

[[ -n '>' -a 1 -eq 1 ]]
# bash: syntax error in conditional expression
# bash: syntax error near `-a'
echo $? # 2
```

It works without the -a, and as such, it works using && instead of the -a:

```
v='>'
test -n "$v"
echo $? # 0

[ -n "$v" ]
echo $? # 0

test -n "$v" && test yes '!=' no
echo $? # 0

[ -n "$v" ] && [ yes '!=' no ]
echo $? # 0
```

There is no mention of this peculiar behaviour inside the documentation:
https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-test

Known versions affected:
GNU bash, version 5.2.37(1)-release (x86_64-apple-darwin22.6.0)
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin22)

If this is intended behaviour, then what is the suitable workaround?
1. Should I always use `&&` instead of `-a`?
2. Should I use a parameter replacement? e.g. `test -n "${v//>/.}" -a 1 -eq 1`
3. Is there another suggestion?

I've cross-posted this on Stack Exchange:
https://unix.stackexchange.com/q/785456/50703

Regards, Benjamin Lupton

Reply via email to