编写一段 shell 程序完成:根据从键盘输入的学生成绩,显示相应的成绩标准,也可以同时输入多个成绩,最多为5 个,以空格分隔。
要求:
1.分出不及格、及格、中、良和优秀等.
2.要有对*.?分的识别能力.
3.如果是多个成绩需要从高到低进行显示.
4.所使用的shell 语句不限.
5.以程序行数最少为最佳.
代码:
#!/bin/sh
#function:将学生成绩进行分类,并将分类结果做一个从大到小的排列。
#学生分数可以是整数,浮点数,可以识别出*,&,$等特殊字符
check_num () {
var1=$(echo $1 | bc 2>/dev/null)
if [ "$var1" != "$1" ] #不是数字
then ret=5
elif [ `echo "$var1 < 0 || $var1 > 100" | bc 2>/dev/null` -eq 1 ] #数字超过范围
then ret=0
elif [ `echo "$var1 < 60" | bc 2>/dev/null` -eq 1 ] #不及格
then ret=1
elif [ `echo "$var1 < 85" | bc 2>/dev/null` -eq 1 ] #及格
then ret=2
elif [ `echo "$var1 < 95" | bc 2>/dev/null` -eq 1 ] #优秀
then ret=3
else ret=4 #非常优秀
fi
return $ret
}
get_para() {
for var in $* #0:这种格式是为了便于排序
do {
case "$var" in
*\?*) echo "0: $var :含有?号。"
continue ;;
*\&*) echo "0: $var :含有&号。"
continue ;;
*\**) echo "0: $var :含有*号。"
continue ;;
*\$*) echo "0: $var :含有$号。"
continue ;;
esac
check_num $var
case "$?" in
"0") echo "0: $var: 该数字超过0-100范围。";;
"1") echo "$var: 不及格。";;
"2") echo "$var: 及格。";;
"3") echo "$var: 优秀。";;
"4") echo "$var: 非常优秀。";;
"5") echo "0: $var :这不是数字。";;
*) echo "0: $var :??";;
esac
}
done
}
while true
do
{
echo "请输入学生成绩序列(-1退出):"
read nums
npara=$(echo "$nums" | wc -w)
if [ 5 -lt $npara ]
then echo "参数个数大于5!"
continue
fi
if [ "$nums" = "-1" ]
then echo "Goodbye."
break
fi
get_para "$nums" | sort -nr -t : -k 1,1
}
done
exit 0
结果抓图: