我找不到任何一个简单的直接资源拼写出的意义,并修复以下BASH shell错误,所以我发布我研究后发现它。
错误:
-bash: [: too many arguments
Google友好的版本:bash open square bracket colon too many arguments。
上下文:if条件在单个方括号中,使用简单的比较运算符,如equals,大于etc,例如:
VARIABLE=$(/some/command); if [ $VARIABLE == 0 ]; then # some action fi
如果$ VARIABLE是一个包含空格或其他特殊字符的字符串,
and single square brackets are used(这是测试命令的快捷方式),那么该字符串可能被拆分成多个字。每个都被视为一个单独的参数。
对于放置包含空格或其他特殊字符的字符串的任何函数调用也是如此。
轻松修复
将变量输出括在双引号中,强制它保持为一个字符串(因此一个参数)。例如,
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
还要注意[:一元运算符期望的错误
如果你看到“太多参数”错误,你可能是从一个具有不可预测的输出的函数得到一个字符串。如果它也可能获得一个空字符串(或所有的空格字符串),这将被视为零参数,即使与上述“快速修复”,并将失败与[:一元运算符
如果你习惯使用其他语言,这是相同的“gotcha” – 你不期望变量的内容被有效地打印到代码之前,它被评估。
这里有一个例子,它阻止了[:太多的参数和[:一元运算符期望的错误:如果它是空的(在这个例子中为0)用一个默认值替换输出,用双引号包裹整个事情:
VARIABLE=$(/some/command); if [ "${VARIABLE:-0}" == 0 ]; then # some action fi
(这里,如果$ VARIABLE为0,则会发生操作,或者为空。当然,如果需要不同的行为,你应该将0(默认值)改为不同的默认值)
最后注意:由于[是测试的捷径,所有上面的错误测试也是正确的:太多的参数(以及测试:一元运算符的期望)