我找不到任何一个简单的简单资源来阐明并修复以下bash shell错误的含义,因此我在研究后发布了我发现的内容。

The error:

-bash: [: too many arguments

Google-friendly version: bash open square bracket colon too many arguments

**Context:**单方面括号中的IF条件,带有简单的比较操作员等于等于:例如:

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

答案

如果你的$VARIABLE是包含空格或其他特殊字符的字符串,和单方面托架(这是test命令),然后将字符串分为多个单词。这些中的每一个都被视为一个单独的论点。

以便one variable is split out into many arguments

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 

**Simple as that.**但是,如果您也不能保证您的变量不会是一个空字符串,或者是一个空格只包含一个空的字符串,则跳过"也要当心…"。


或者,一个alternate fix 是使用双方括号(这是new test命令)。

但是,这仅存在于bash(显然是Korn和Zsh)中,因此可能与默认外壳不兼容/bin/shETC。

这意味着在某些系统上,it might work from the console but not when called elsewhere, like from cron,取决于所有内容的配置方式。

看起来像这样:

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

如果您的命令包含这样的双方括号,并且您在日志中获得错误,但可以从控制台中起作用,请尝试交换[[对于此处建议的替代方案,或确保运行脚本的任何内容都使用支持的外壳[[又名new test


还要当心[: unary operator expected错误

如果您看到"太多参数"错误,则很可能会从具有无法预测的输出的函数中获取字符串。If it’s also possible to get an empty string (或所有空格字符串),即使使用上述"快速修复",这也将被视为零参数,并且会失败[: unary operator expected

如果您习惯了其他语言,则是相同的"陷阱" - 您不希望在评估它之前有效地将变量的内容有效地打印到代码中。

这是一个防止[: too many arguments[: unary operator expected错误:如果输出为空,则用默认值替换(在此示例中,0),围绕着整个过程包裹着双重引号:

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

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


Final note: 自从[是一个快捷方式test,以上所有错误也是如此test: too many arguments(并且test: unary operator expected

来自: stackoverflow.com