我的任务是打印给出的数字是表示ISOSCELES,EQUILATERAL还是SCALENE三角形。 我的代码只打印ISOSCELES:错误在哪里?
#!/bin/bash
read a b c
if [ "$a" == "$b" ] && { [ "$b" = "$c" ] && [ "$c" = "$a" ]; }
then
echo "EQUILATERAL"
exit 1
elif [ "$a" == "$b" ] && { [ "$b" = "$c" ] || [ "$c" = "$a" ]; }
then
echo "ISOSCELES"
elif ([[ "$a" != "$b" ]] && [[ "$b" != "$c" ]] && [[ "$c" != "$a" ]])
then
echo "SCALENE"
fi
答案 0 :(得分:2)
您的脚本中有[
,[[
,=
和==
的奇怪混合物。如果您使用bash,我建议您使用(( ))
进行所有数值比较。这会创建一个算术上下文,因此这也意味着您不需要使用$
来引用您的变量:
if (( a == b )) && (( b == c )) && (( c == a )); then echo "equilateral"
elif (( a != b )) && (( b != c )) && (( c != a )); then echo "scalene"
else echo "isoceles"
fi
不需要对等腰进行单独测试。
答案 1 :(得分:2)
您只需计算不同数字的数量即可得到答案。
#!/bin/bash
read a b c
different=$(printf '%s\n' $a $b $c |
sort -n |
uniq -c |
wc -l
)
case $different in
(1) echo EQUILITERAL ;;
(2) echo ISOSCELES ;;
(3) echo SCALENE ;;
esac
您还应该在开头验证三角形不等式:
#!/bin/bash
read a b c
sorted=$( printf '%s\n' $a $b $c | sort -n )
ineq=${sorted/$'\n'/+}
ineq=${ineq/$'\n'/>}
(( $ineq )) || exit 1
different=$( uniq -c <<< "$sorted" | wc -l )
case $different in
(1) echo EQUILITERAL ;;
(2) echo ISOSCELES ;;
(3) echo SCALENE ;;
esac
答案 2 :(得分:1)
==
和=
答案 3 :(得分:0)
尝试(对数字使用==或-eq):
#!/bin/bash
read a b c
if [ "$a" == "$b" ] && { [ "$b" == "$c" ] && [ "$c" == "$a" ]; }
then
echo "EQUILATERAL"
elif ([[ "$a" != "$b" ]] && [[ "$b" != "$c" ]] && [[ "$c" != "$a" ]])
then
echo "SCALENE"
else
echo "ISOSCELES"
fi
答案 4 :(得分:0)
有点简化:
#!/bin/bash
read a b c
if [ "$a" -eq "$b" ] && [ "$b" -eq "$c" ] && [ "$c" -eq "$a" ];
then
echo "EQUILATERAL"
exit 1
elif [ "$a" -ne "$b" ] && [ "$b" -ne "$c" ] && [ "$c" -ne "$a" ];
then
echo "SCALENE"
else
echo "ISOSCELES"
fi
我认为这是目的输出:
$ echo "6 6 6" | ./script
EQUILATERAL
$ echo "6 6 5" | ./script
ISOSCELES
$ echo "4 5 6" | ./script
SCALENE
答案 5 :(得分:0)
使用读取命令将traingles的两侧作为输入。
read a
read b
read c
if (( a == b )) && (( b == c )) && (( c == a ));
then
echo "EQUILATERAL"
elif (( a != b )) && (( b != c )) && (( c != a ));
then
echo "SCALENE"
else
echo "ISOSCELES"
fi