Shell实战(一)
- 导语
- 程序实例
- 解压缩交互
- 功能描述
- 代码和运行结果
- 实现解析
- 监视CPU和内存
- 功能描述
- 代码和运行结果
- 实现解析
- 用户管理
- 功能描述
- 代码和运行结果
- 实现解析
- 总结
导语
本篇引入三个书上的shell程序设计项目,由于书上的版本较老,这里给出的都是完善之后的版本,经过测试在ubuntu23上都可以运行
程序实例
解压缩交互
功能描述
提供一个简单的可交互界面,该程序需要实现能够判断给定路径是否为文件,是否有操作权限,以及是否能对该路径下文件/目录进行压缩/解压缩,将各种压缩操作集成在该程序当中
代码和运行结果
#编写文件压缩和解压缩程序界面并实现其功能
f_compress()
{if [ ! -e "$1" ]#如果路径不存在,这里和书上不一样thenecho "路径不合法"returnfiif [ ! -x "$file" ]thenecho "无权限执行"return fiecho "*************************************"echo "选择压缩格式"echo "1-*.bz2"echo "2-*.gz"echo "3-*.tar"echo "4-*.tar.gz"echo "5-*.zip"echo "*************************************"read formatecho $formatcase "$format" in1) bzip2 -z $file;;2) gzip -r $file;;3) tar -cvf $file.tar $file;;4) tar -zcvf $file.tar.gz $file;;5) zip -r $file.zip $file;;*) echo "错误输入";;esac
}f_decompress()
{if [ ! -f "$file" ]then echo "文件不存在"return fiif [! -x "$file" ]then echo "无权限"return ficlearecho "*************************************"echo "选择解压格式"echo "1-*.bz2"echo "2-*.gz"echo "3-*.tar"echo "4-*tar.gz"echo "5-*.zip"echo "*************************************"read formatecho $formatcase "$format" in1) bzip2 -d $file;;2) gzip -d $file;;3) tar -xvf $file;;4) tar -zxcf $file;;5) unzip $file;;esac
}quit()
{echo "*************************************"echo "使用结束,退出"echo "*************************************"exit 0
}clear
while true
doecho "*************************************"echo "请选择想要实现的功能"#交互界面echo "1-压缩"echo "2-解压"echo "3-退出"echo "请输入对应数字"read choiceecho "您选择的是$choice号操作"case "$choice" in1) echo "请输入要压缩的路径或文件"read fileecho $filef_compress $file#进行压缩;;2) echo "请输入要压缩的路径或文件"read fileecho $filef_decompress $file#解压;;3) echo "退出本程序"quit;;*) echo "输入有误,请重新输入"sleep 2clear;;esac
done
可以看到222成功被压缩成zip格式
将222重命名为333,然后对222.zip进行解压
可以看到222.zip被成功解压成了222文件夹
实现解析
该程序分成了好几个部分来实现:解压函数,压缩函数,退出函数,主函数,菜单的功能被集成在主函数当中
压缩函数首先判断路径合法性,随后根据用户的选择确定压缩格式,再执行相应的压缩指令完成压缩
解压函数同理,不赘述
退出函数在界面上打出退出消息
主函数向用户提供大的功能板块,之后根据用户的选择对对应函数进行调用
监视CPU和内存
功能描述
监控CPU和内存,显示系统日期时间,将使用情况等信息输出到文件capstats.csv
代码和运行结果
#!/bin/bash# 设置输出文件
OUTFILE="/root/capstats.csv"# 获取系统日期和时间
DATE=$(date +%Y%m%d)
TIME=$(date +%k:%M:%S)# 获取系统运行时间和用户数
TIMEOUT=$(uptime)
USERS=$(echo "$TIMEOUT" | gawk '{print $4}')# 获取系统负载,并去除逗号
LOAD=$(echo "$TIMEOUT" | gawk '{print $9}' | sed 's/,//')# 使用vmstat获取内存信息
VMSTAT_OUTPUT=$(vmstat 1 2)
FREE=$(echo "$VMSTAT_OUTPUT" | sed -n '4p' | gawk '{print $4}')
IDLE=$(echo "$VMSTAT_OUTPUT" | sed -n '4p' | gawk '{print $15}')# 将结果追加到CSV文件
echo "date: $DATE, time: $TIME, users: $USERS, load: $LOAD, free: $FREE, idle: $IDLE" >> "$OUTFILE"
可以看到,程序执行之后的结果被写入了capstats.csv中
实现解析
该程序单纯是命令的堆砌,首先设置好输出文件和要输出的字符串及其格式,通过uptime获得运行时间和用户数,通过管道调用gawk获得用户数,通过管道将TIMEOUT的值传递给gawk命令,提取第九个字段(系统负载),然后使用sed命令去除可能存在的逗号,并赋值给变量LOAD
VMSTAT_OUTPUT=$(vmstat 1 2)
:使用vmstat命令获取内存和交换空间等信息,执行两次采样,间隔为1秒,并将输出赋值给变量VMSTAT_OUTPUT。
FREE=$(echo "$VMSTAT_OUTPUT" | sed -n '4p' | gawk '{print $4}')
:通过管道将VMSTAT_OUTPUT的值传递给sed命令,提取第四行,然后再传递给gawk命令,提取第四个字段(空闲内存),并赋值给变量FREE。
IDLE=$(echo "$VMSTAT_OUTPUT" | sed -n '4p' | gawk '{print $15}')
:同样通过管道提取第四行的第十五个字段(空闲CPU时间百分比),并赋值给变量IDLE
用户管理
功能描述
程序实现了与用户的交互,提供一个简单的交互界面,实现日期展示、用户创建/删除、用户进程显示,对每个功能分开进行实现
代码和运行结果
menu()
{clearecho "****"echo "选择功能"echo "1.日期"echo "2.创建新用户"echo "3.删除现有用户"echo "4.显示进程信息"echo "5.退出"echo "****"
}dateinfo()
{clearecho "****"echo "日期为:"echo &date "+%B%d%A"echo "****"
}usercreate()
{clearecho "****"echo "创建用户"echo "----"echo "输入新用户的名字"read usernameuseradd $usernameif(($? ==0))thenecho "----"echo "创建成功"elseecho "----"echo "创建失败"fi
}userdelete()
{clearecho "****"echo "删除用户"echo "----"echo "输入用户的名字"read usernameuserdel $usernameif(($?==0))then echo "----"echo "删除成功"elseecho "----"echo "删除失败"echo "delete error!"fi
}listprocess(){clearecho "****"echo "显示进程"echo "----"echo "输入现有用户"read usernameclearecho "$[username] 的进程有"echo "----"ps -u $username
}quit()
{clearecho "****"echo "结束"echo "****"sleep 5
}echo "****"
echo "启动"
echo "****"sleep 5
clearif [ $USER = "root" ]
thenuserflag=0while(($userflag==0))domenuuserchoice=0while (($userchoice == 0))doecho "输入选择(1-5):"read userchoicecase $userchoice in1) dateinfo;;2) usercreate;;3) userdelete;;4) listprocess;;5) userflag=1;;*) echo "输入错误,请输入正确选择";;esacdoneif (($userflag==0))then echo "****"echo "回车返回"readfidonequitclear
elseuserflag = 0echo " 请切换管理员登陆 "
fi
输入1,可以得到当前日期
显示当前用户的进程信息
实现解析
根据功能分成几个函数实现:菜单、时间显示、用户创建、进程展示、菜单退出、用户删除、主函数
菜单用来实现交互界面,只有单纯的输出
时间显示作为功能实现,调用date命令,并设置格式输出
用户创建,调用useradd直接创建用户,并进行合法性判断
用户删除同上,略
进程展示,调用ps命令,对指定用户下的进程信息进行展示
退出和主函数略
总结
本次的三个实战程序基本都提供了用户交互,通过集成shell已有的命令形成新的程序来方便使用,可以看出shell语言的强大