linux - Bash 脚本 : too many arguments in [ test ]

标签 linux bash testing quoting

我有下面的 bash 脚本:

#!/bin/bash
#
[ $# -eq 1 -a $1 = "--help" -o $# -eq 0 ] && {
  echo Help will come here
}

当我运行它时:

$ ./script 
./script: line 3: [: too many arguments
$ ./script --help
Help will come here

如您所见,当我不传递参数 ( $# -eq 0 ) 时,它会因“太多参数”而失败。 所以,我直接在终端测试了它:

$ a=1;b=2;c=3
$ [ $a -eq 1 -a $b -eq 2 -o $c -eq 3 ] && echo ok
ok
$ [ $a -eq 0 -a $b -eq 2 -o $c -eq 3 ] && echo ok
ok
$ [ $a -eq 0 -a $b -eq 0 -o $c -eq 3 ] && echo ok
ok
$ [ $a -eq 0 -a $b -eq 0 -o $c -eq 0 ] && echo ok
$ [ $a -eq 0 -a $b -eq 2 -o $c -eq 0 ] && echo ok
$ [ $a -eq 1 -a $b -eq 2 -o $c -eq 0 ] && echo ok
ok

那么,如果它在终端中完美运行,为什么它不能传递参数呢?

谢谢,

最佳答案

这样表达你的条件:

[ $# -eq 1 ] && [ "$1" = "--help" ] || [ $# -eq 0 ]

实际上,[是一条命令,命令中后面的元素进行分词。如果参数为空(或包含空格且未加引号),您可能会遇到意外。不推荐使用 -a-o

请注意,如果您想在 echo 语句之前使用 && 逻辑运算符(而不是 if 语句),您需要将上面的内容括在大括号内,否则运算符优先级(加上惰性求值)可能会产生不正确的结果。

{ [ $# -eq 1 ] && [ "$1" = "--help" ] || [ $# -eq 0 ] ; } && { echo...

如果你不介意使用特定于 Bash 的语法,你也可以这样写:

[[ $# -eq 1 && $1 = "--help" || $# -eq 0 ]]

请注意,在这种情况下,不需要双引号 $1,因为 [[ ]] 构造是特殊的 shell 语法,而不是命令,什么是inside 不受分词影响。因为只有一个测试,所以您不需要在 && { echo... 之前将它括在大括号内。

关于linux - Bash 脚本 : too many arguments in [ test ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43309990/

相关文章:

bash - Docker:如何将 bash 与基于 Alpine 的 docker 镜像一起使用?

c# - TFS/MSTest 管理员权限

java - 在 Mockito 中有什么方法可以设置规则以在调用特定对象类型的属性时返回值?

regex - 如何在 Linux 中查找扩展名为数字的文件

c -/dev/mem 的 mmap 因 virt_to_phys 地址的无效参数而失败,但地址是页面对齐的

Git 错误远程 : Empty password

regex - 不是正则表达式中的运算符

testing - Selenium 多次运行相同的方法

linux - 调整大小时的 SDL 鼠标范围

android - Linux:keytool 显示 "Unrecognized command: -exportcert"