天天看點

SHELL筆記:-if-else,case練習

編寫一段 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
           

結果抓圖:

SHELL筆記:-if-else,case練習