shell脚本练习实例详解
Posted 是大姚呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本练习实例详解相关的知识,希望对你有一定的参考价值。
shell脚本练习实例
1、倒计时脚本
题目1: 编写10s倒计时脚本
思路: 这里需要使用for循环语句对秒数进行循环自减,并在循环体内部执行输出显示倒计时提示语句的命令。在使用echo命令时加入\\r可以实现倒计时提示语句中时间自动刷新这一效果,\\r表示光标移至行首但不换行(\\r前必须有空格),注意前面必须加上-n参数表示不要在最后自动换行、-e参数表示执行处理\\r字符的动作,sleep 1
使脚本程序每执行一次循环后休眠1秒。
脚本执行效果如下:
题目2: 编写1:10s倒计时脚本
思路: 对于引入分钟的倒计时脚本,将分钟和秒对应的数字作为变量值赋予这两个变量,使用外层for循环语句对秒数进行循环自减,在循环体内部利用if语句分三种情况进行条件判断及处理:当分和秒都为0时说明倒计时结束退出程序;当秒为0、分大于0时说明时间减少了1分钟,输出显示倒计时提示语句后对秒变量重新赋值为60,对分钟变量值自减1;其他情况即只有秒数自减时输出显示倒计时提示语句。
脚本执行效果如下:
2、创建用户脚本
题目: 编写users_create.sh,执行sh users_create.sh userlist passlist
建立userlist用户列表中的用户,设定userlist列表中的密码为passlist列表中的密码,当执行脚本时脚本后跟的文件个数不足两个时报错,当userlist用户列表文件行数(用户数量)和passlist列表文件行数(对应密码数量)不一致时报错,当文件不存在时报错,当用户存在时报错。
思路: 编写脚本的难点在于如何判断userlist用户列表文件行数(用户数量)和passlist列表文件行数(对应密码数量)是否一致,这里我们可以使用awk命令统计输出两个指定文件的行数(NR表示行数)并分别赋值给两个变量,通过比较两个变量即可判断文件行数是否一致。如果文件行数一致,将文件行数对应的序号作为循环语句的循环变量(可以对应用户列表、密码列表两个文件),使用sed命令显示循环变量对应的用户列表文件中行并将显示的结果赋值给用户名变量,使用sed命令显示循环变量对应的密码文件中行并将显示的结果赋值给密码变量,执行创建用户的操作,如果创建成功即修改该用户的密码为密码变量对应的值,如果创建不成功则显示用户已存在。
脚本执行效果如下:
3、系统资源使用统计脚本
题目: 编写check_upload.sh脚本,统计系统中CPU和内存的使用总量。
思路: 使用ps ax -o %mem
、ps ax -o %cpu
可以查看所有进程占用CPU和内存量,将查看结果通过管道,使用awk命令将所有值($1表示读取每一行的第一个字符串)循环+=,得到所有进程占用CPU和内存的总量(awk命令在循环+=时默认忽略不计算字符串)。
脚本执行效果如下:
4、数据库备份脚本
题目: 编写db_dump.sh数据库备份脚本,执行db_dump.sh 数据库密码
,脚本执行后会备份数据库中的所有库到/mnt/mysqldump目录中,备份文件名称为“库名称.sql”,当此文件存在时报错并询问动作:当输入“S”跳过备份;当输入“B”时先备份“库名称.sql”文件为“库名称_当前日期.sql”再执行库备份操作;当输入“O”时在备份时覆盖原文件;当输入“E”时退出动作判断循环;输入其他内容提示动作输入错误并重新输入。
思路: 在编写备份脚本前要先进行以下判断:用户在执行脚本时是否输入数据库密码;使用rpm -q
命令查询数据库包是否安装,这里$?是上一条指令的返回值,即显示命令最后的退出状态,0表示没有错误,其他任何值表示有错误,通过这一返回值即可判断rpm -q
命令是否执行成功,即数据库是否安装;根据数据库套接字文件是否存在判断数据库是否运行。以上条件判断无误后,统计数据库中所有的库名称并将其赋值给一个字符串数组变量,再利用for循环语句对字符串数组变量中的每一个库进行处理,利用内层while语句、case语句实现动作判断循环功能。
(注: exit 1表示非正常运行导致退出程序,exit 0表示正常运行并退出程序,在shell中调用完脚本程序后,使用命令echo $?就可以看到程序的exit值)
脚本执行效果如下:
5、swap分区自动创建脚本
题目: 用脚本在当前系统中添加一个swap分区,swap分区大小为500M并在开机时自动激活此分区。
思路: 当我们使用fdisk交互式方式创建swap分区时,需要回答多个提示问题,如果我们想要编写一个可以自动创建挂载swap分区的脚本,就需要根据shell中具体的交互信息作出不同的回答,这就需要在编写脚本时使用expect语句。脚本编写的主要难点在于对于相同的交互信息如何按照先后顺序作出不同的回答,由于两个expect语句在回答问题时是不相关的,其按照语句块先后顺序依次执行,所有我们可以使用多个expect语句块来解决这一问题。
首先编写第一部分应答内容:编写第一个expect语句块,创建大小为500M的swap分区;编写第二个expect语句块,在所划分磁盘空间上有曾经格式化的旧文件系统的情况下,回答问题对其进行初始化。此时分区划分完成,使用命令查看截取磁盘最后一个分区的分区号(我们新划分的分区)并将其赋值给一个变量,接着编写第二部分应答内容:编写第一个expect语句块,更改变量指定分区的分区类型为Linux Swap;编写第二个expect语句块,保存设定并退出。此时swap分区创建完成,接下来对其进行格式化、将挂载策略语句写入/etc/fstab设备挂载策略文件中,swapon -a
重新读取设备挂载策略文件,在开机时此swap分区即可自动激活。
(注: expect匹配关键字时不区分大小写)
脚本执行效果如下:执行脚本后swapon -s
可以查看到新建的swap分区已自动挂载
以上是关于shell脚本练习实例详解的主要内容,如果未能解决你的问题,请参考以下文章