当前位置: 首页 > 知识库问答 >
问题:

if[](方括号)中“[:太多参数”错误的含义

安博文
2023-03-14

我找不到任何一个简单直接的资源来解释下面的BASH shell错误的含义和修复方法,所以我将发布我在研究后发现的内容。

错误:

-bash: [: too many arguments

谷歌友好版:bash开方括号冒号参数太多。

上下文:单方括号中的if条件,带有简单的比较运算符,如equals、greater than等,例如:

VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
  # some action
fi 

共有3个答案

季凡
2023-03-14
匿名用户

您可以获得[:太多参数[: a:二进制运算符预期错误的另一种情况是,如果您尝试测试所有参数"$@"

if [ -z "$@" ]
then
    echo "Argument required."
fi

如果调用foo,它会正常工作。sh或foo。sh arg1。但是如果你传递了多个参数,比如foo。sh arg1 arg2,则会出现错误。这是因为它被扩展为无效语法。

检查参数是否存在的正确方法是[“$#”-等式0]。($#是参数的数量)。

施知
2023-03-14

只是偶然发现了这篇文章,得到了相同的错误,试图测试两个变量是否都为空(或非空)。结果是一个复合比较-7.3。其他比较运算符-高级Bash脚本指南;我想我应该注意以下几点:

  • 我用-e,起初认为它的意思是“空”;但这意味着“文件存在”-使用z测试空变量(字符串)

这是一个工作命令(搜索目录中的所有txt文件,并转储grep找到的包含这两个词的文件):

find /usr/share/doc -name '*.txt' | while read file; do \
  a1=$(grep -H "description" $file); \
  a2=$(grep -H "changes" $file); \
  [ ! -z "$a1" -a ! -z "$a2"  ] && echo -e "$a1 \n $a2" ; \
done

编辑2013年8月12日:相关问题说明:

请注意,当使用经典的test(单方括号)检查字符串等式时,必须在“is equal”运算符之间留有一个空格,在这种情况下,该运算符是一个“equals”符号(尽管两个等号似乎也被接受为等式运算符)。因此,这失败了(无提示):

$ if [ "1"=="" ] ; then echo A; else echo B; fi 
A
$ if [ "1"="" ] ; then echo A; else echo B; fi 
A
$ if [ "1"="" ] && [ "1"="1" ] ; then echo A; else echo B; fi 
A
$ if [ "1"=="" ] && [ "1"=="1" ] ; then echo A; else echo B; fi 
A

... 但是加上空间,一切看起来都很好:

$ if [ "1" = "" ] ; then echo A; else echo B; fi 
B
$ if [ "1" == "" ] ; then echo A; else echo B; fi 
B
$ if [ "1" = "" -a "1" = "1" ] ; then echo A; else echo B; fi 
B
$ if [ "1" == "" -a "1" == "1" ] ; then echo A; else echo B; fi 
B
左华灿
2023-03-14
匿名用户

如果变量是一个包含空格或其他特殊字符的字符串,并且使用了单方括号(这是测试命令的快捷方式),则该字符串可能被拆分为多个单词。每一个都被视为一个单独的论点。

因此,一个变量被分解为多个参数:

VARIABLE=$(/some/command);  
# returns "hello world"

if [ $VARIABLE == 0 ]; then
  # fails as if you wrote:
  # if [ hello world == 0 ]
fi 

对于任何放下包含空格或其他特殊字符的字符串的函数调用,情况也是如此。

用双引号包装变量输出,强制它保持为一个字符串(因此是一个参数)。例如,

VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
  # some action
fi 

就这么简单。但请跳到“还要小心……”如果你也不能保证你的变量不会是空字符串,或者一个只包含空格的字符串。

或者,另一种修复方法是使用双方括号(这是新测试命令的快捷方式)。

然而,这只存在于bash中(显然还有korn和zsh),因此可能与由/bin/sh等调用的默认shell不兼容。

这意味着在某些系统上,它可能在控制台上工作,但在其他地方调用时不工作,例如在cron上,这取决于一切的配置方式。

它看起来是这样的:

VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
  # some action
fi 

如果您的命令包含这样的双方括号,并且日志中出现错误,但它可以从控制台工作,请尝试将[/code>替换为此处建议的替代方法,或者确保无论运行什么脚本,都使用支持新测试的shell。

如果您看到“参数太多”错误,很可能是从输出不可预测的函数中获取字符串。如果也可能得到一个空字符串(或所有空白字符串),即使使用上述“快速修复”,这也将被视为零参数,并将在以下情况下失败:[:预期一元运算符

如果你习惯了其他语言,这也是同样的“明白了”-在对变量进行求值之前,你不希望变量的内容像这样有效地打印到代码中。

这是一个防止[:太多参数[:一元操作符预期错误的示例:如果输出为空,则用默认值替换输出(在本例中,0),整个过程中包含双引号:

VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
  # some action
fi 

(在这里,如果$VARIABLE为0或为空,则会发生操作。当然,如果需要不同的行为,则应将0(默认值)更改为不同的默认值)

最后注意:由于[test的快捷方式,因此上述所有内容对于错误test也是如此:参数过多(以及test:一元操作符预期

 类似资料:
  • 我在RestController类中有以下requestMethod,它运行良好: 我还有一个假客户也工作得很好。我在两种方法中都添加了一个名为forceSupplier的新参数,但添加后,我发现,但我真的不明白为什么我会收到此消息,因为参数是相同的。 这是假装的方法: 我做错了什么?谢谢

  • 问题内容: 我正在Swift的Web框架Vapor中进行我的第一步。 引起我注意的第一段代码是: 我在这里不了解语法。我的意思是,我在调用方法,但是我也在定义一种将请求作为参数的函数。我知道这将导致通过URL 可访问的get方法并将返回“ Hello”。对我来说不清楚的是这段代码如何工作以及编译器如何解释它。 问题答案: 这称为尾随闭包语法。 在这个答案中,我给出了各种闭包的语法糖的简要介绍。 此

  • 我创建了模拟客户端来调用我的RestApi。当我尝试运行我的服务,我收到错误从这个请求方法对于@请求身体我只使用对象类型,因为每次我可以发送另一个身体请求。

  • 问题内容: 我很好奇,Python编程中的三个不同括号是什么意思?不知道我是否正确,但是如果我错了,请纠正我: 或者,如果这些支架可用于其他用途,欢迎提供任何建议!谢谢! 问题答案: :用于定义可变数据类型-列表,列表推导以及索引/查找/切片。 :定义元组,操作顺序,生成器表达式,函数调用和其他语法。 :两种哈希表类型-字典和集合。

  • 在我的本地主机[PHP版本5.5.9-1ubuntu4.5]上,以下代码正常工作: 同时,该代码也在运行: 但在生产服务器[PHP版本5.3.3-7 squeeze23]上,在这两种情况下,我都有一个错误: 错误:致命错误(4):语法错误,意外的'[' 怎么回事啊?我如何用最简单的方法修复它?(因为在项目中改变所有数组是非常不可行的,我甚至不知道如何管理第二种情况下与Auth...)

  • 问题内容: 我在弄清楚csv.dictreader的参数时遇到了麻烦,并且意识到我不知道方括号表示什么。 从文档中: 我希望对类实例化​​的参数进行总结。 谢谢 问题答案: 方括号表示这些参数是 可选的 。您可以忽略它们。 因此,在这种情况下,您仅 需要 将参数传递给。如果您要传递第二个参数,它将被解释为参数。第三个是,等等。 如果只想指定eg和,则必须显式命名关键字参数,如下所示: 有关关键字参