shell实例
案例一:输入网卡名称,输出对应ip
问题
输入不合理
网卡名如何获取
如何获取需要的网卡ip
分析
利用if判断输入是否正确
grep和awk获取所有网卡名并保存至networkname文件中
sed 使用变量进行替换时,要用双引号
awk 使用变量进行匹配时,要把变量用三引号括起来
实现解析
手动给变量k赋值,判断k是否为空。将所有网卡名都存到netorkname.txt
文件,用sed命令通过替换产生networkname_back.txt文件,比较两个文件
行数检查网卡名是否正确。最后awk匹配网卡名输出ip。
案例二:将/root/下的所有目录(一级)复制到/tmp目录下
问题
多次实现复制
复制到指定位置
分析
采用for循环结构实现列出root所有目录
for循环中调用函数实现多次复制
实现解析
定义copy函数,在for中调用函数,实现多次复制。
案例三:选择网卡序号返回相应ip
问题
输入是否正确
打印出网卡名及序号
根据序号决定输出
分析
ifconfig命令grep awk匹配所有的网卡并记录到networkname文件
sed替换文件,测试文件大小变化决定输入是否正确
根据行数进行匹配输出
实现解析
将所有网卡名称及序号保存至networkname.txt文件,打印出文件中所有内
容,通过输入给n赋值。if判断是否为空,比较n.txt与n_new.txt字节数来判
断输入是否正确。按照输入的数字取出对应序号的网卡名,用awk打印出
对应ip。
案例四:按照文件内容创建或删除用户
问题
判断文件是否存在
区分创建或删除功能
根据文档创建或删除用户
分析
-e参数检查文件是否存在
利用case实现选择功能
利用for循环读取文件行数进行创建或删除
实现解析
case判断,决定是创建还是删除。如果为create,输入userfile和
passwdfile并分别通过-e参数判断文件是否存在,通过awk N自增判断行数
在循环中按照行数设置user与password。如果是delete,在循环中按照行
数删除对应user。如果输入为其他,则返回error。
案例五:批量传送文件
问题
检查ip与password的文件
获取传送文件的目的ip
分析
利用-e检测文件是否存在
循环给予rsync命令ip
实现解析
首先判断输入的文件是否存在,通过awk计算行数,在循环中使用rsync命
令将指定的文件传输到指定位置。在机器之间要做免密,否则需要在运行
过程中输入密码。
案例六:自动远程连接并保持登录
问题
自动连接并输入密码
保持登录
分析
使用expect send输入密码
实现解析
进入expect环境通过send输入密码进行连接,使用interact保持连接。
案例七:自动ping各个主机ip,如果通则输出主机名和ip,如果不通则输出ip
问题
连接各个主机
获取到各个主机的主机名
显示其他内容
分析
利用ssh hostname获取主机名
循环输出时去除关键字
sed对\r进行替换
实现解析
首先设立获取主机名的函数,然后在循环中ping各个ip。通过函数给
hostname赋值并除去多余内容,最后输出。
案例八:监控cpu、内存和硬盘利用率
问题
获取到相关资源
显示的更人性化
分析
利用vmstat、free和cut命令
显示时间
实现解析
首先判断vmstat命令是否存在,然后分别对cpu mem disk进行判断,
如果符合要求则返回相应的值。
案例九:url指定目录下载
问题
检测输入是否正确
创建目录递归
手动选择是否创建目录
分析
-z检测输入是否正确
case选择是否创建
wget -p参数下载文件
实现解析
编写函数,只需判断$2有无值便可得知输入是否正确。利用case选择是否创
建目录,wget下载。下载后利用返回码等于0判断下载是否成功。
案例十:找到指定目录下后缀名为.txt文件进行改名和压缩操作
问题
查找到.txt文件
替换名字
批量打包压缩
分析
利用find查找.txt文件
tar -zcvf压缩
for循环进行
mv进行改名
实现解析
首先判断目录和输入是否正确,进入到目录后find查找.txt文件利用for循环
进行改名,之后进行压缩,压缩结束再通过for循环把文件名改回去。
案例十一:一个脚本根据选择执行对应命令
问题
区分要执行的命令
分析
采用case进行区分
实现分析
采用case区分ls、date和pwd的功能,出现其他情况则结束
案例十二:监控mysql服务是否开启,如果未开启则重启mysql服务并发送一封邮件
问题
每隔一段时间检测一遍
一直循环
发送邮件
分析
使用sleep命令间隔时间
下载mailx使用163邮箱,修改/etc/mail.rc文件填入账号密码
163邮箱开启smtp
使用mail 命令发送邮件
实现解析
while死循环每隔60秒检测一次mysql端口是否开启,判断之后决定重启并发送邮件。
案例十三:输出每行数字个数并计算文件中数字总个数
问题
获取到每行的数字个数
获取文件数字个数
文件是否存在
分析
用-e参数判断文件是否正确
tr命令获取文件数字
实现解析
检测文件是否存在,awk获取行数,循环输出每行数字个数并输出,最后
获取文件数字总个数并输出。
案例十四:每天凌晨三点备份数据库,备份文件在本地一份,在远程一份,本地文件保存七天
问题
定时执行脚本
远程发送文件
文件定时删除
分析
crontab定时执行
rsync发送到远程
find查找并删除七天之前的文件
实现解析
首先备份数据库到指定的目录,再通过find查找并rm删除掉七天之前的.sql
类型文件,然后通过rsnyc发送到192.168.2.180的/root/mysqlbak目录下,
最后修改crontab -e定时执行脚本。
案例十五:随机生成1-100的一个数进行猜测,猜对退出
问题
随机生成数字
判断输入是否正确
猜测失败重复输入
分析
利用random生成随机数
正则匹配判断输入是否正确
循环输入
实现解析
利用random并限定随机数的范围给b赋值,通过匹配判断输入的a是否规范,再比较b与
a的大小给出提示,当b=a时退出。
案例十六:根据时间输出不同问候语
问题
获取时间
区分时间
分析
awk获取小时
if判断区分时间段
实现解析
利用awk分两次最终获取到时间,再if判断时间所在的时间段输出不同语句。
案例十七:把磁盘情况每日记录,不考虑cron,只写脚本
问题
查看磁盘情况
创建文件格式为年月日
分析
使用df命令创建
date提取时间
实现解析
使用df命令将输出保存至date定义的文件名下
案例十八:实现给输入的名字进行随机赋值并打印,且不能相同输入q或Q退出
问题
随机赋值
输入同一的名字输出同一数字
分析
random随机复制
整体循环
把所有对应输入到文件里,便于查找输出
实现解析
创建需要存放name和n对应关系的文件,整体在循环中,先判断输入是否
为q或Q决定是否退出,在检测输入是否符合要求,不符合就重新输入。随
机值赋值给变量,检查文件中是否已经存在这个值,匹配name是否存在判
断输出已有值还是输出随机值并保存。
案例十九:检测httpd和mysql服务是否安装和启动。
问题
检测两个服务是否安装
未安装要进行安装并且开启
检测服务是否启动
未启动要进行开启
分析
使用systemctl进行状态检测
并对返回值进行匹配决定进行安装还是开启
实现解析
对查看状态返回的值进行匹配,判断决定要执行下载安装还是开启服务
案例二十:检测当前所有机进程占用内存的和
问题
检测到当前所有进程的内存
对数值进行相加
分析
用ps aux命令进行检测
采用awk循环相加进行求和
实现解析
使用ps aux 检测内存值,使用awk内循环使内存值相加为sum并输出
案例二十一:删除文件前五行中带字母的行,删除文件5-10行中的字母
问题
对前五行进行处理
对五到十行进行处理
其他行不变
分析
对每一行进行处理根据行号进行判断
实现解析
先获取行数,对一到五行打印除了带有字母的行,对五到十行打印除了字
母的内容,十行以外正常输出。
案例二十二:查看机器是否开启web服务(80端口),如果开启了是hpptd还是nginx还是其他
问题
检查是否有80端口
输出类型
分析
利用netstat命令查看所有端口
awk匹配输出类型
实现解析
匹配80端口是否开启,判断a是否为空,a不为空则服务开启,并检查是何
类型,a为空则未开启
案例二十三:计算100以内能整除3数的和
问题
计算能被三整除
从1到100
求和
分析
通过循环进行多次判断
%为除
实现解析
从1-100循环每次除以三,把能整除的数字相加,不能整除就继续执行,知道
循环完成,输出sum
案例二十四:输入数字,输出这个数字,让输入end时退出
问题
可以一直输入输入脚本不停止
不能输入除了数字的内容
检测到end时退出
分析
写在循环里
判断到end时退出
正则匹配只允许输入数字
实现解析
整体卸载死循环里,首先检测输入是否为end,如果为end则退出,在判断
输入是否为数字,如果不为数字则退出本次循环,重新输入,如果输入为
数字,则输出这个数字
案例二十五:简单的弹出式菜单用户能根据显示的菜单选项执行相应的命令
问题
弹出式菜单
根据输入决定执行命令
分析
read -p 提示菜单
case决定执行命令
实现解析
利用read -p打印提示菜单,再利用case决定要执行什么命令,如果超出范围
就做出提示并退出。
案例二十六:查看是否有输入的用户名,如果有则输出相关信息,每五分钟执行一次。
问题
查看是否有这个用户
获取信息
每五分钟执行一次
分析
查找/etc/passwd文件是否有输入的用户
正则匹配取出对应信息
每五分钟执行一次
实现解析
判断输入是否为空,为空则退出,不为空继续执行。匹配输入的名字是否存在,存在测
输出相应信息,不存在则提示并退出。
案例二十七:测试所有pid是否在proc目录里
问题
获取到所有pid
获取proc目录中所有内容
检查有无出入
分析
利用ps aux命令查看pid
将proc目录下的内容存入文件
匹配判断是否有出入
实现解析
先进行说明,os为1需要检查,os为0不需要检查,将pid和proc分别存入文件,循环匹配
pid文件内容是否都存在在proc中。如果发生不匹配现象,给os赋值为1。最后输出os。
案例二十八:测试ip是否存活
问题
测试ping是否能通
多次测试
分析
ping三次决定是否存活
运用循环
实现解析
定义ip列表,使用循环ping各个ip,ping的失败次数达到三次时,不再ping这个ip,输出
失败,ping成功则输出成功。
案例二十九:查看网页状态码,如果是200,则报错
问题
获取到网页状态码
判断是否为200
分析
使用curl命令获取状态码
if判断是否为200
实现解析
通过curl命令-o保存网页,-s静音模式-w匹配状态码获取到网页状态码,再进行判断是否
为200,如果为200,则提示报错信息。
案例三十:判断输入ip格式是否正确
问题
输入要进行判断是否符合ip格式
分析
使用if判断
正则匹配判断
实现解析
输入后首先进行分析四个数字是否都小于等于255,如果符合则给valid_check赋值yes,
进一步if判断四个数字都为0-9组成的1-3位数,如果不匹配则输出格式错误,如果符合0-
9组成的1-3位数但valid_check不为yes,则输出ip不可用,如果两项都符合,则输出ip可
用。