以下将bash: test: too many arguments
在中产生异常test
,退出状态为 2:
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
它可以在不使用 -a 的情况下工作,因此,使用 && 而不是 -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
文档中没有提及这种特殊行为: https ://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-test
已知受影响的版本:GNU bash,版本 5.2.37(1)-release (x86_64-apple-darwin22.6.0) GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin22)
如果这是预期的行为,那么合适的解决方法是什么?
- 我应该总是使用
&&
而不是 吗-a
? - 我应该使用参数替换吗?例如
test -n "${v//>/.}" -a 1 -eq 1
- 还有其他建议吗?