一、初级部分
初级题目:
用shell 脚本监控系统的各项参数,包括操作系统版本、内核版本、主机名、登录用户、内存和磁盘使用情况等。并可以将脚本加入系统环境中,可以直接在终端里执行。
需求分析
Linux系统中,并没有直接直白的查看系统版本,内核版本,内存磁盘使用状态的方式。本次实验,我可以通过调用文件的方式,将当前的系统状态直接输出,达到监控系统状态的目的。同时将脚本加入环境中,可以在任何目录中输出状态,达到方便快捷的目的。
题目分析:
调用ubuntu系统的文件 输出ubuntu当前系统的各种状态。在shell脚本运行良好后,对环境变量path加入shell脚本所在的目录,以实现在终端内直接执行的功能。
关键调用命令:
uname -s:显示操作系统名称
uname -r:显示操作系统发行编号
uname -m:显示电脑类型
cat:连接文件并打印到屏幕上 此处用来显示文件内容 调取系统自带文件来输出信息
例:cat /proc/meminfo 输出内存使用状态
代码
#!/bin/bash
function get_system_version()
{
echo "==================================="
OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`
KERNEL=`uname -r`
if [ -f /etc/SuSE-release ] ; then
DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
elif [ -f /etc/mandrake-release ] ; then
DIST='Mandrake'
PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
elif [ -f /etc/os-release ]; then
DIST=`awk -F "PRETTY_NAME=" '{print $2}' /etc/os-release | tr -d '\n"'`
elif [ -f /etc/debian_version ] ; then
DIST="Debian `cat /etc/debian_version`"
REV=""
fi
if ${OSSTR} [ -f /etc/UnitedLinux-release ] ; then
DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
fi
OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"
echo "系统版本:${OSSTR}"
}
function get_kernel_version()
{
echo "========================================"
kernel_version=`uname -r`
echo "内核版本:${kernel_version}"
}
function get_hostname()
{
echo "========================================"
echo "主机名:$HOSTNAME"
}
function get_login_users()
{
echo "========================================"
echo "登录用户信息"
who -s
}
function get_mem_info()
{
echo "========================================"
echo "内存信息:"
cat /proc/meminfo
free -h| grep Mem
free -h | grep Swap
}
function get_disk_info()
{
echo "========================================"
echo "存储状态:"
df -h
}
function main()
{
get_kernel_version
get_system_version
get_hostname
get_login_users
get_mem_info
get_disk_info
}
main $@
代码编译后
使用 sudo vim /etc/profile 打开配置文件
在文件中加入
export PATH=$PATH:~/final
将我的综合设计的文件夹加入到path环境变量里,使在所有目录下运行bash命令时都会检查~/final文件夹。以此达到题目的要求。
运行结果
二、中级部分
题目
编写shell程序实现“学生信息管理”,包括查看、增加、删除、修改、统计等基本功能;
需求分析
在linux上,如果不能使用mysql一类的软件,就需要一个简单的文件信息管理系统,在本次实验中是管理学生的文件信息。实现查看、增加、删除、修改、统计等功能后,就可以对学生的学院,成绩,编号等信息进行简单管理。
题目分析
此题目比较寻常,目标是将学生信息加以保存到文件中,所以先设计数据保存形式,此处我们选择简单的使用txt文本保存。目录为/home/nevermore/final/level2save
在输入并保存数据后,进行数据的统计输出(我使用的是冒泡排序)。如此达到题目要求。
代码
#!/bin/bash
#!/bin/awk -f
#此处是保存数据的目录
StudentInfoPath="/home/nevermore/final/level2save/StudentInfo.txt"
CollegeInfoPath="/home/nevermore/final/level2save/CollegeInfo.txt"
GradeInfoPath="/home/nevermore/final/level2save/GradeInfo.txt"
insert_college_info(){
echo "请输入要加入的学院编号:"
read collegeNo
export existFlag=false
while read line
do
lineCollegeNo=${line/,*/}
if [ "$lineCollegeNo" = "$collegeNo" ];
then {
export existFlag=true
break
}
fi
done<$CollegeInfoPath
if [ "$existFlag" == "true" ];
then {
export existFlag=false
echo "已有此学院!,插入失败"
}
else {
echo "请输入学院的名称: "
read collegeName
echo "$collegeNo,$collegeName" >> $CollegeInfoPath
echo "学院记录插入成功,插入的记录为($collegeNo,$collegeName)"
}
fi
}
del_student_info(){
echo "请输入要删除的学生编号: "
read studentNo
export nowline=0;
export delCount=0;
while read line
do
export nowline=$(($nowline + 1))
echo $line":"$nowline
lineStudentNo=${line/,*/}
if [ "$lineStudentNo" = "$studentNo" ];
then {
sed "/$lineStudentNo/d" $StudentInfoPath > $StudentInfoPath"_back"
export delCount=$(($delCount + 1))
mv $StudentInfoPath"_back" $StudentInfoPath
}
fi
done<$StudentInfoPath
echo "删除成功: 被删除学生编号$studentNo,删除个数为$delCount"
}
del_college_info(){
echo "请输入要删除的学院编号: "
read collegeNo
export nowline=0;