bash-条件三角形错误

时间:2014-10-24 13:29:13

标签: bash

我的任务是打印给出的数字是表示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

6 个答案:

答案 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)

  1. 您在测试中混合===
  2. 更改顺序,首先测试EQUILATERAL,然后测试SCALENE,然后您不需要测试ISOSCELES( quartum non datur ; - )

答案 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