我通过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
为什么会这样?我尝试了很长时间,很难纠正它,但没有成功
答案 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