以下将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
- 还有其他建议吗?
根据文档,这确实看起来像一个错误,但我无法解释。(
'<'
也会造成这种情况。)不过我确实有一个解决方法。假设表达式的顺序不重要,切换表达式就可以了:
最终,最好使用这种
&&
形式——请参阅这个答案“Bash 对 -a(文件存在)的否定不会改变结果,而对 !-e 的否定会改变结果”或这个答案“bash 的条件表达式中 -a 和 -e 有什么区别?”了解详情。