| 湖北民族大學2021年春季考查課試卷 |
A或B |
||||||||||||||||
| A 卷 |
|||||||||||||||||
| 課 程 |
Linux系統及編程 |
使用班級 |
0320203-04 |
制卷份數 |
姓名 |
||||||||||||
| 命題人 |
張華 |
試卷審核人 |
單位審核人 |
答題紙數 |
班級 |
||||||||||||
| 題 號 |
一 |
二 |
三 |
四 |
五 |
六 |
七 |
八 |
九 |
十 |
合計 |
學號 |
|||||
| 評 分 |
分數 |
||||||||||||||||
| 閱卷人 |
|||||||||||||||||
| 考查形式為論文撰寫,要求如下:
以一個實際Linux Shell腳本管理系統為核心,從系統產生背景、問題提出、問題分析、系統分析、系統設計、系統實現等方面進行闡述。
1、題名要求簡明扼要,能反映論文主題;摘要必須說明研究目的、方法、結果、結論,字數200字左右為宜,忌與引言及結論中的內容雷同; 2、 字數3000~5000 字 3、 論文參考架構 (請注意各級內容的字體格式,以示區分) 摘 要(五號黑): 內容(五號宋) 關鍵字(五號黑): 內容(五號宋) 1 引言
評分標准: 內容主題符合20分,系統設計30分,系統實現30分,格式規范20分,合計100分 |
基於Linux Shell腳本學生管理系統的設計與實現
目錄
1.緒論 3
1.1 研究背景以及意義 3
1.2 Linux特點 3
1.3 Shell腳本介紹 3
2.腳本設計 3
2.1 系統概要設計 3
2.2 系統功能模塊 3
2.2.1 模塊層次圖 3
2.2.2 數據存儲體系 4
2.2.3 系統流程圖 4
2.2.4 菜單設計 5
3.腳本實現 6
3.1 登錄注冊模塊 6
3.2 增加數據模塊舉例(添加學院) 7
3.3 刪除數據模塊舉例(刪除學生) 8
3.4 修改數據模塊舉例(更新學院) 9
3.5 查詢數據模塊舉例(成績統計) 11
總結與展望 13
1.緒論
1.1研究背景以及意義
Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和Unix的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的Unix工具軟件、應用程序和網絡協議。它支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡操作系統。
Shell的開發與使用是Linux操作系統日漸普及的產物。而對於微型Linux系統shell的研究是Linux研究的重點。利用微型的shell,不僅可以讓用戶更容易操作Linux,也可以幫助用戶理解Linux工作原理,同時保護內核的安全性。本文對shell的研究包括對其功能的了解,並實現對shell的列表、管道、輸入重定向、輸出重定向等命令功能,可以比較全面地認識shell解釋器,編寫出可以實現的各種功能的具體代碼,這樣來編寫一個簡易的Linux。
1.2 Linux特點
Linux采取了許多安全技術措施,其中有對讀、寫進行權限控制、審計跟蹤、核心授權等技術,這些都為安全提供了保障。Linux由於需要應用到網絡服務器,這對穩定性也有比較高的要求,實際上Linux在這方面也十分出色。Linux系統在設計的時候就是針對多用戶環境的,所以對系統文件,用戶文件都做了明確地區分,每個文件都有不同的用戶屬性,作為一個普通用戶,通常只能讀寫自己的文件,而對一般的系統文件只能讀取不能改動,一些敏感的系統文件甚至連讀取都是被禁止的,這種設計從根本上保證了系統的安全性,即使一個用戶文件出現了問題,也不會殃及整個系統。
1.3 Shell腳本介紹
shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕返回給用戶。這種對話方式可以是交互的方式(從鍵盤輸入命令,可以立即得到shell的回應),或非交互(執行腳本程序)的方式。
2.腳本設計
2.1 腳本概要設計
概要設計的主要任務是設計軟件結構和數據結構。設計軟件結構的具體任務是:將一個復雜系統按功能進行模塊划分、建立模塊的層次結構及調用關系、確定模塊間的接口及人機界面等。數據結構設計包括數據特征的描述、確定數據的結構特性、以及數據庫的設計。顯然,概要設計建立的是目標系統的邏輯模型,與計算機無關。總體設計包括系統模塊結構設計和計算機物理系統的配置方案設計。
整體分為三個功能模塊,分別是學院信息管理、學生信息管理以及成績信息管理,用戶登錄后可通過輸入相應編號進入不同的功能模塊,相應能對各模塊的數據功能進行增刪改查操作,且能將操作永久存儲至系統磁盤。
2.2 系統功能模塊
shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕返回給用戶。這種對話方式可以是交互的方式(從鍵盤輸入命令,可以立即得到shell的回應),或非交互(執行腳本程序)的方式。
2.2.1模塊層次圖
shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕返回給用戶。這種對話方式可以是交互的方式(從鍵盤輸入命令,可以立即得到shell的回應),或非交互(執行腳本程序)的方式。

圖2.1 模塊層次圖
2.2.2數據存儲體系
數據存儲使用文件儲存方式實現,分為用戶密碼存儲文件、學院存儲文件、學生存儲文件以及分數存儲文件,都單獨存放於各自文件中,需要時使用awk命令讀取。

圖2.2 數據文件分布圖
2.2.3系統流程圖
系統主要以CRUD操作為主,每次執行增加操作時,需要檢測數據庫中是否已經存在;刪除操作時,需要查詢數據庫中是否已有相應的數據;改修數據時既需要判斷用戶輸入的數據是否存在,也需要判斷修改后的數據是否符合條件;查詢時,直接按行讀取數據庫中的數據,而后顯示即可,但查詢成績時,需要對數據進行排序而后輸出前三名或總分前五名。下面是具體的流程圖:

圖2.3 系統流程圖
2.2.4菜單設計
菜單設計中,主要以功能模塊為主,交互式友好度為輔下面詳見程序菜單運行圖:
|
圖2.4.1 登錄菜單 |
圖2.4.2 主菜單 |
|
圖2.4.3 學院管理菜單 |
圖2.4.4 學生管理菜單 |

圖2.4.5 成績管理菜單
3.腳本實現
3.1 登錄注冊模塊
登錄功能的實現,首先讓用戶輸入用戶名,再根據用戶輸入的用戶名使用awk命令組合管道,在數據庫中尋找對應的密碼,再取出存入變量中,而后再判斷用戶輸入的密碼是否與數據庫中的密碼一致,如果一致則登錄成功,進入歡迎頁面,如果失敗則提醒用戶登錄失敗,需要重新輸入用戶名以密碼。
| login() { read -p "請輸入用戶名:" user_name a="$(cat file | awk '$1=="'$user_name'"' | cut -d ' ' -f2-)" b=$(echo "$a" | sed 's/ //g') cat file | awk '$1=="'$user_name'"' &>/dev/null if [ $? -eq 0 ]; then read -s -p "請輸入你的密碼:" user_passwd c=$(echo $user_passwd | sed 's/ //g') if [[ "$b" == "$c" ]]; then clear echo "登錄成功!" else clear echo "密碼驗證不正確,請選擇 1. 重新創建 2. 重新登錄 3. 退出系統" read choice case $choice in 1) create_user ;; 2) login ;; 3|*) echo "退出系統" exit 0 ;; esac fi else echo "該用戶不存在,請選擇 1. 重新創建 2. 重新登錄 3. 退出系統" #創建用戶 clear read choice case $choice in 1) create_user ;; 2) login ;; 3|*) echo "退出系統" exit 0 ;; esac fi #登錄成功,跳轉至歡迎頁 Welcome } |
|
圖3.1.1 創建用戶 |
圖3.1.2 登錄成功 |
3.2增加數據模塊舉例(添加學院)
學院信息管理模塊中,主要是對數據規范性做文章,當添加學院信息時,需要檢測新添加的學院是否存在於數據庫中,且各字段不能為空,所以一般在增刪改查中需要編寫大量的數據校驗代碼。
添加學院校驗代碼:
| add_school() { read -p "學院編號:" school_num #防止輸入空格 while [ "$school_num" = '' ]; do read -p "輸入的學院編號不能為空,請重新輸入學院編號:" school_num done while grep -w "$school_num" "$schools_db" >/dev/null; do echo "已經存在該編號的學院了,請改用其他編號!" read -p "學院編號:" school_num done read -p "學院名稱:" school_name #防止輸入空格 while [ "$school_name" = '' ]; do read -p "輸入的學院名稱不能為空,請重新輸入學院名稱:" school_name done #符合規則,將其寫入到數據庫中 echo -e "$school_num,\t$school_name,\r" >>$schools_db } |
|
圖3.2.1 添加學院 |
圖3.2.2 添加學院時輸入已存在的數據 |
3.3刪除數據模塊舉例(刪除學生)
刪除模塊較為簡單,只需要用戶輸入數據后,進行一次查詢判斷即可完成,如果存在數據則刪除,如果數據不存在則提示數據不存在。
| #2.刪除學生 del_student() { read -p "請輸入要刪除的學生的學號:" num echo "該學生的信息為:" grep "^$num" $students_db read -p "確定刪除嗎?[yes|no]" choice case "$choice" in yes) sed -i -e "/^$num/d" $students_db if [ "$?" -eq 0 ]; then echo "刪除成功" else echo "不存在該條記錄或者刪除失敗" fi ;; no) : ;; *) echo "請輸入[yes|no]" del_student ;; esac } |
|
圖3.3 刪除學生 |
3.4修改數據模塊舉例(更新學院)
相對較為復雜的是修改學院,因為其涉及判斷輸入編號以及字段是否為空、以及輸入字段不存在等相關校驗信息,且修改時可能還會涉及多表修改,具體代碼為:
| #5.修改學院信息 update_school() { echo "--------------------------" read -p "輸入學院編號:" school_num #防止輸入空格 while [ "$school_num" = '' ]; do read -p "輸入有誤,請重新。輸入學院編號:" school_num done while ! grep -w "$school_num" "$schools_db" >/dev/null; do echo "不存在該編號的學院,請輸入編號存在的學院編號: " read -p "輸入學院編號:" school_num #防止輸入空格 while [ "$school_num" = '' ]; do read -p "輸入有誤,請重新。輸入學院編號:" school_num done done echo "--------------------------" echo -e "編號\t學院\t" grep -w $school_num $schools_db echo "--------------------------" read -p "要修改的字段信息::" str1 #防止輸入空格 while [ "$str1" = '' ]; do read -p "輸入有誤,請重新。要修改的字段信息::" str1 done while ! grep -w "$school_num,.*," "$schools_db" | grep -w "$str1" >/dev/null; do echo "不存在該字段,請重新輸入:" read str1 #防止輸入空格 while [ "$str1" = '' ]; do read -p "輸入有誤,請重新。要修改的字段信息::" str1 done done read -p "修改后的字段信息" str2 #防止輸入空格 while [ "$str2" = '' ]; do read -p "輸入有誤,請重新。修改后的字段信息:" str2 done read -p "確定修改嗎?[y|n]" choice case "$choice" in yes|y) sed -i "/${school_num#,}/ s/$str1/$str2/" $schools_db if [ "$?" -eq 0 ]; then echo "修改成功" echo "--------------------------" echo "修改后的學院信息" echo -e "編號\t學院\t" cat $schools_db if [ "$str1" = "$school_num" ]; then #如果修改的是學院編號還要修改學生表里的學院編號 sed -i "/${school_num#,}/ s/$str1/$str2/" $students_db fi else echo "修改失敗" fi ;; no|n) : ;; *) echo "請輸入[yes|no]" del_student ;; esac } |
修改學院模塊會涉及schools_db數據庫與students_db數據庫的聯合查詢,確保數據有效性。

圖3.4 修改學院流程圖
3.5查詢數據模塊舉例(成績統計)
查詢數據模塊中比較有特色的是成績統計功能,這里主要研究的是統計各科目的前三名和個人總成績前五,這里使用awk命令加管道,再利用sed命令取出前幾條數據將其輸出。
| #6.個人總成績前5名排序 sort_score_sum_five() { echo "-----------總成績前1到5名---------------" printf "學號\t總成績\t排名\t\n" awk -F"," '{ary[$1]+=$4} END{for(key in ary) print key "," ary[key]",\t"}' $scores_db | sort -r -n -t',' -k 2 | awk -F"," '{print $1 ",\t" $2",\t" NR ",\t"}' | sed -n '1,5p' echo "--------------------------" } |
| #7.每個學科的前3名 such_course_sort_score() { awk 'BEGIN{FS=","}{ary[$3]=$3} END{for(key in ary) print ary[key]}' $scores_db >temp size=$(cat temp | wc -l) top=1 while [ "$top" -le "$size" ]; do var=$(sed -n "$top p" temp) grep "$var," $scores_db | sort -r -n -t "," -k 4 | sed -n '1,3p' | awk 'BEGIN{FS="," ; printf "科目\t學號\t姓名\t排名\t\n"}{printf $3 "\t" $1 "\t" $2 "\t" NR "\t\n"}' | column -t echo "" top=$(($top + 1)) done rm -rf temp } |
|
圖3.5.1 每科的前3名 |
圖3.5.2 個人總成績前5名 |
總結與展望
在互聯網和Linux系統不斷發展的今天,以Linux系統為代表的服務器技術及產品得到了極大的推廣, Shell腳本程序也是花樣翻新層出不窮。通過這次設計,我拓寬了知識面,鍛煉了能力,綜合素質得到較大提高。基於Linux Shell腳本學生管理系統設計的基本目的,在於通過理論與實際的結合進一步提高思想覺悟,將以前學習的知識串聯起來並進一步鞏固。
在本次論文設計的 Shell腳本開發過程中,也學習到了很多軟件工程領域的規范化的開發方法、數據存儲同時也鍛煉了自己查找資料和文檔撰寫的能力。在需求分析階段,我根據所學Linux系統及編程理論知識,特別是需求分析、總體設計、詳細設計部分的知識,和其中的分析和建模的方法,設計了需要實現的基本功能。提出
本項目所要實現的目標,系統性能、安全性、可靠性方面的要求等。在系統設計階段,我們又仔細復習教材中
關於概要設計中應用的相關方法、應注意的幾個問題和概要設計階段的目標,在需求分析的基礎上有提出了更
具體的可行性分析和實現方案。
通過這次開發使自己對知識的運用能力得到提升,而且還鍛煉了我的自學能力,更重要的是培養了觀
察、分析和解決問題的實際工作能力,對以后的工作將會起到較大作用。
論文源文件:
https://xiaochengzi.lanzoui.com/i1sZPs2dn8j
程序源文件:
https://xiaochengzi.lanzoui.com/iB1Zds2dpkd











