BASH中的“[:太多参数”错误

时间:2015-01-24 15:54:27

标签: bash parameters

我通过HackerRank学习BASH。这是一个练习,其中给出了三角形的长度,然后你需要找出三角形是等腰,斜角或等边。我写了下面的代码:

read a
read b
read c
if  [ [ "$a" -eq  "$b" ] && [ "$b" -eq  "$c" ] ]  
then 
    echo "EQUILATERAL"
    elif  [ [ "$a" -eq "$b" ] || [ "$b" -eq  "$c" ] ]  
    then
    echo "ISOSCELES"
    else
    echo "SCALENE"
    fi

但后来我收到以下错误

solution.sh: line 4: [: too many arguments
solution.sh: line 7: [: too many arguments
solution.sh: line 7: [: too many arguments

为什么会这样?我尝试了很长时间,很难纠正它,但没有成功

4 个答案:

答案 0 :(得分:2)

您可以组合条件,无论是否省略周围的括号,如

if [ "$a" -eq  "$b" ] && [ "$b" -eq  "$c" ]

或将条件与-a / -o组合使用,如此

if [ "$a" -eq  "$b" -a "$b" -eq  "$c" ]

请参阅http://wiki.bash-hackers.org/commands/classictest#and_and_or

答案 1 :(得分:0)

&&||是Bash列表运算符。在一系列命令中,仅当前一个命令返回0(&&)或非零(||)时才执行下一个命令。

[是Bash内部test命令的别名,其参数包括-eq-ne]结束其命令行。输入help test了解详情。

因此,如果您编写条件表达式,则不要将列表运算符放在括号内。

例如,尝试使用此代码代替代码中的相应行:

if  [ "$a" -eq  "$b" ] && [ "$b" -eq  "$c" ]
then

答案 2 :(得分:0)

[不是bash中的分组运算符,您不能使用它来对测试进行分组。

有许多不同的方式来表达您想要进行的测试,数字评估模式可能最容易阅读

 if (( a == b && b == c ))

 if (( a == b || b == c || c == a ))

如果您有小数部分,这将会中断,但对整数可以正常工作。

答案 3 :(得分:-1)

[是一个条件命令,就像sh test内置命令的别名一样。

[[bash具有更多测试选项的情况相同。

因此,请在[[[之间做出选择,而不是[ [,这意味着两个命令。

示例:

# [ [ -n 'test' ] ]
bash: [: too many arguments
# [ -n 'test' ] && echo $?
0
# [[ -n 'test' ]] && echo $?
0