Bash / Linux if elif else问题

时间:2017-03-28 19:05:06

标签: linux bash

目前正致力于我的bash技能。我已经根据if / elif / else给我的导师做了一些活动,但不能把手指放在下面的那个。

基本上我的任务是根据成绩的输入输出以下内容。  低于40%=失败40%至59%=通过60%至69%=优异70%及以上=优异

它似乎被第一个elif所吸引,将等级表示为低于70的任何等级而不检查其他等级,当我更改订单时它也会给出相同的结果。

echo "Please enter your grade"
read GRADE
echo

     if [ $GRADE -ge 70 ]; then
         echo "Well done, you got a distinction"

    elif [ $GRADE -ge 60 ] || [ $GRADE -le 69 ]; then
          echo "Well done, you got a merit"
    elif [ $GRADE -ge 40 ] || [ $GRADE -le 59 ]; then
          echo "Well done, you got a pass"
    else 
          echo "Unfortunately you failed"
      fi

4 个答案:

答案 0 :(得分:1)

有点不寻常的解决方案

#bash 4.0+
while read -r -p 'Grade? (h-help)> ' grade
do
    case "$grade" in
        q) echo "quitting..." ; exit 0 ;;
        h) echo "Enter numeric value (0..100) or q for quit" ;&
        '') continue ;;
        *[!0-9]*) echo "Must be numeric value" ; continue ;;
    esac
    case 1 in
        $((grade > 100)) ) echo "impossible" ;;
        $((grade >= 70)) ) echo "distinction" ;;
        $((grade >= 60)) ) echo "merit" ;;
        $((grade >= 40)) ) echo "pass" ;;
                        *) echo "fail" ;;
    esac
done

答案 1 :(得分:0)

您的问题在于使用||(或)而不是&&(和)。 如果你输入" 10",10不到69,那么它将落入第一个else

在脚本顶部使用set -x可以帮助您解决这类问题。

答案 2 :(得分:0)

最好将-a用于AND,将-o用于[]中的OR。并做这样的事情:

if   [ $GRADE -lt 40 ]; then
    echo "Unfortunately you failed"
elif [ $GRADE -ge 40 -a $GRADE -lt 60 ]; then
    echo "Well done, you got a pass"
elif [ $GRADE -ge 60 -a $GRADE -lt 70 ]; then
    echo "Well done, you got a merit"
else
    echo "Well done, you got a distinction"

答案 3 :(得分:0)

你的问题来自|| (或),你需要使用&& (和)。例如,65大于60且小于69。

echo "Please enter your grade"
read GRADE
echo

 if [ $GRADE -ge 70 ]; then
     echo "Well done, you got a distinction"

elif [ $GRADE -ge 60 ] && [ $GRADE -le 69 ]; then
      echo "Well done, you got a merit"
elif [ $GRADE -ge 40 ] && [ $GRADE -le 59 ]; then
      echo "Well done, you got a pass"
else
      echo "Unfortunately you failed"
  fi