我找不到任何一个简单直接的资源来解释下面的BASH shell错误的含义和修复方法,所以我将发布我在研究后发现的内容。
错误:
-bash: [: too many arguments
谷歌友好版:bash开方括号冒号参数太多。
上下文:单方括号中的if条件,带有简单的比较运算符,如equals、greater than等,例如:
VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
# some action
fi
您可以获得[:太多参数
或[: a:二进制运算符预期
错误的另一种情况是,如果您尝试测试所有参数"$@"
if [ -z "$@" ]
then
echo "Argument required."
fi
如果调用foo,它会正常工作。sh或foo。sh arg1。但是如果你传递了多个参数,比如foo。sh arg1 arg2,则会出现错误。这是因为它被扩展为无效语法。
检查参数是否存在的正确方法是[“$#”-等式0]。($#
是参数的数量)。
只是偶然发现了这篇文章,得到了相同的错误,试图测试两个变量是否都为空(或非空)。结果是一个复合比较-7.3。其他比较运算符-高级Bash脚本指南;我想我应该注意以下几点:
这是一个工作命令(搜索目录中的所有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
如果变量是一个包含空格或其他特殊字符的字符串,并且使用了单方括号(这是测试命令的快捷方式),则该字符串可能被拆分为多个单词。每一个都被视为一个单独的论点。
因此,一个变量被分解为多个参数:
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编程中的三个不同括号是什么意思?不知道我是否正确,但是如果我错了,请纠正我: 或者,如果这些支架可用于其他用途,欢迎提供任何建议!谢谢! 问题答案: :用于定义可变数据类型-列表,列表推导以及索引/查找/切片。 :定义元组,操作顺序,生成器表达式,函数调用和其他语法。 :两种哈希表类型-字典和集合。
问题内容: 我在弄清楚csv.dictreader的参数时遇到了麻烦,并且意识到我不知道方括号表示什么。 从文档中: 我希望对类实例化的参数进行总结。 谢谢 问题答案: 方括号表示这些参数是 可选的 。您可以忽略它们。 因此,在这种情况下,您仅 需要 将参数传递给。如果您要传递第二个参数,它将被解释为参数。第三个是,等等。 如果只想指定eg和,则必须显式命名关键字参数,如下所示: 有关关键字参
在我的本地主机[PHP版本5.5.9-1ubuntu4.5]上,以下代码正常工作: 同时,该代码也在运行: 但在生产服务器[PHP版本5.3.3-7 squeeze23]上,在这两种情况下,我都有一个错误: 错误:致命错误(4):语法错误,意外的'[' 怎么回事啊?我如何用最简单的方法修复它?(因为在项目中改变所有数组是非常不可行的,我甚至不知道如何管理第二种情况下与Auth...)