目前在我的bash技能上工作。 我已经做了一些基于if / elif / else给我的导师的活动,但不能把我的手指放在下面的一个。
基本上我的任务是根据input的等级输出以下内容。 less于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
有点不寻常的解决方案
#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
你的问题在于使用||
(或)而不是&&
(和)。 如果你输入“10”,那么10是小于69,所以它会落入第一个。
在脚本的顶部使用set -x
会帮助你理解这种事情。
最好使用-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"
你的问题来自|| (或),您需要使用&&(和)。 例如65大于60 AND小于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