Bash / Linux如果ELIF其他问题

目前在我的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