我找不到任何一个简单直接的资源来说明以下BASH shell错误的含义和修复方法,所以我在研究后发布了我的发现。
错误:
-bash: [: too many arguments
google友好的版本:bash开方括号冒号太多参数。
上下文:在单个方括号中的if条件,带有简单的比较运算符,如=,大于etc,例如:
VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
# some action
fi
我找不到任何一个简单直接的资源来说明以下BASH shell错误的含义和修复方法,所以我在研究后发布了我的发现。
错误:
-bash: [: too many arguments
google友好的版本:bash开方括号冒号太多参数。
上下文:在单个方括号中的if条件,带有简单的比较运算符,如=,大于etc,例如:
VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
# some action
fi
当前回答
我的剧本也有同样的问题。但当我做了一些修改后,它为我工作了。我这样做了:-
export k=$(date "+%k");
if [ $k -ge 16 ]
then exit 0;
else
echo "good job for nothing";
fi;
这样我就解决了我的问题。希望这对你也有帮助。
其他回答
我也面临着同样的问题。@sdaau的回答很有逻辑。这里我所做的对我来说是语法正确的,但是有太多的参数错误。
错误的语法:
if [ $Name != '' ] && [ $age != '' ] && [ $sex != '' ] && [ $birthyear != '' ] && [ $gender != '' ]
then
echo "$Name"
echo "$age"
echo "$sex"
echo "$birthyear"
echo "$gender"
else
echo "Enter all the values"
fi
在上面的if语句中,如果我传递如下所述的变量值,那么我也会得到语法错误
export "Name"="John"
export "age"="31"
export "birthyear"="1990"
export "gender"="M"
使用下面的语法,我得到预期的输出。 正确的语法:
if [ "$Name" != "" -a "$age" != "" -a "$sex" != "" -a "$birthyear" != "" -a "$gender" != "" ]
then
echo "$Name"
echo "$age"
echo "$sex"
echo "$birthyear"
echo "$gender"
else
echo "it failed"
fi
有几点我们必须牢记在心
用""代替" 用-a代替&& 在操作符[a=b]前后加空格,不要在if条件中使用[a=b]
因此上面的解决方案对我有用!!
另一种可能得到[:太多参数或[:a:二进制运算符预期错误的情况是,如果您尝试测试所有参数"$@"
if [ -z "$@" ]
then
echo "Argument required."
fi
如果将foo.sh或foo.sh调用为arg1,则可以正常工作。但是如果你传递多个参数,比如foo.sh arg1 arg2,你会得到错误。这是因为它被扩展为[-z arg1 arg2],这不是一个有效的语法。
检查参数是否存在的正确方法是["$#" -eq 0]。($#是参数的数量)。
有时候如果你不小心触碰了键盘,移开了一个空格。
if [ "$myvar" = "something"]; then
do something
fi
将触发此错误消息。注意']'前面的空格是必须的。
我的剧本也有同样的问题。但当我做了一些修改后,它为我工作了。我这样做了:-
export k=$(date "+%k");
if [ $k -ge 16 ]
then exit 0;
else
echo "good job for nothing";
fi;
这样我就解决了我的问题。希望这对你也有帮助。
刚刚碰到这篇文章,通过得到相同的错误,试图测试两个变量是否都为空(或非空)。结果是一个复合比较——7.3。其他比较操作符-高级bash脚本指南;我想我应该注意以下几点:
一开始我用-e来表示“空”;但这意味着“文件存在”-使用-z测试空变量(字符串) 字符串变量需要加引号 对于复合逻辑与比较,可以: 使用两个测试&&它们:[…]&&[…]] 或者在单个测试中使用-a操作符:[…]——……]
下面是一个工作命令(搜索目录中的所有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日:相关问题说明:
注意,当使用经典测试(单个方括号[)检查字符串是否相等时,你必须在“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