目前正致力于我的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
答案 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