shell循环语句和函数

编写一个好脚本的要素
逻辑结构定义清晰
脚本可以重用
多加入注释
学会调试脚本
echo配合exit命令或sleep命令
bash -x 脚本 (调试)

知识要点
while语句、shift命令
case语句
shell函数应用

while语句的结构
1.重复测试某个条件,只要条件成立则反复执行
在这里插入图片描述
注意:&&和管道的坑,
管道坑解决办法有将子进程的值先存入文件中或者使用输入重定向
2.while语句的各种用法
在这里插入图片描述while read 变量1 变量2(读一行执行一行)
注:echo ${!i} 表示两次引用
死循环中 空命令 : 状态返回值是0

While语句的应用示例

1.每5分钟输出一次时间到/tmp/time.txt
禁止使用计划任务在这里插入图片描述
2.批量添加用户
用户名称以stu开头,按数字顺序进行编号
一共添加20个用户,即stu1、stu2、……、stu20
初始密码均设为123456在这里插入图片描述3.使用inotify-tools,实现自动同步备份
在这里插入图片描述4.分析当前主机中所有用户,哪些是普通用户,哪些是系统用户在这里插入图片描述5.猜商品价格游戏
通过变量RANDOM获得随机数
提示用户猜测并记录次数,猜中后退出循环在这里插入图片描述在这里插入图片描述Shift迁移语句
用于迁移位置变量,将 $1~$9 依次向左传递
例如,若当前脚本程序获得的位置变量如下:
$1=file1、$2=file2、$3=file3、$4=file4
则执行一次shift命令后,各位置变量为:
$1=file2、$2=file3、$3=file4
再次执行shift命令后,各位置变量为:
$1=file3、$2=file4

shift迁移语句应用示例:
1.通过命令行参数传递多个整数值,并计算总和
在这里插入图片描述2.通过命令行参数传递多个整数值,并计算总和在这里插入图片描述$#表示位置参数的个数 $@表示位置参数的内容

case语句的结构
针对变量的不同取值,分别执行不同的命令序列 在这里插入图片描述在这里插入图片描述在这里插入图片描述case语句应用示例
1.击键类型识别
提示用户输入一个字符
判断出该字符是字母、数字或者其他字符在这里插入图片描述在这里插入图片描述2.数字范围识别
判断分数范围,分出优秀、合格、不合格三档在这里插入图片描述3.编写系统服务脚本
使用start、stop、restart等参数来控制服务
服务控制指令通过位置变量$1传入
能够通过chkconfig命令来管理此服务在这里插入图片描述补充:查看某些服务在哪些运行级别中是否开启
使用chkconfig --list命令或者chkconfig --list 服务名
服务名就是脚本文件名,这些脚本文件在/etc/init.d
怎样启动服务?
Service 服务名 start
或者
/etc/init.d脚本名 start
通过chkconfig查看每个级别是否开启服务,其实就是在每个级别对应的目录下创建软连接文件来实现的。
每个级别对应的目录分别是
0 /etc/rc0.d
1 /etc/rc1.d
2 /etc/rc2.d
3 /etc/rc3.d
4 /etc/rc4.d
5 /etc/rc5.d
6 /etc/rc6.d
这些目录中的软连接文件,链接到/etc/init.d目录下的脚本
这些目录中的软连接文件名,有以下规定:
如果要开启的,则文件名以s开头
如果要停止的。则文件名以k开头在这里插入图片描述使用chkconfig --level 3 vsftpd on 修改3级别的vsftpd服务为开启

chkconfig: - 60 50 - 表示默认级别,默认是2345 60 表示服务启动顺序,值越大优先级越低 50 表示服务关闭顺序,值越大优先级越低

Shell函数应用
1.Shell函数概述
在编写Shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可称为函数
合理使用Shell函数,可以使脚本内容更加简洁,增强程序的易读性,提高执行效率
功能模块化,方便协同合作

函数就是语句块
一个函数完成一个小功能,也就是说函数功能要单一。
解耦(各自独立)

2.Shell函数由两部分组成:
函数名(在一个脚本中必须唯一)
函数体(命令或语句集合)

3.定义新的函数(必须先定义后使用)在这里插入图片描述推荐用第二种。例如
在这里插入图片描述4.调用已定义的函数在这里插入图片描述函数必须先定义再调用

5.向函数内传递参数(可以使用位置参数)在这里插入图片描述脚本的位置参数,不能直接在函数内部使用

6.函数作用
1)简化代码
2)脚本的结构更容易读懂,维护成本低
3)模块化设计

注意:函数必须先定义再调用

Shell函数应用示例
1.在脚本中定义一个加法函数,用于计算2个整数的和
调用该函数计算(12+34)、(56+789)的和在这里插入图片描述2.新安装的mysql配置管理员密码的函数
默认新安装的mysql管理员密码为空在这里插入图片描述3.检查rpm包的函数
如果rpm已经安装,则显示“包 is installed”
如果rpm包未安装,则用yum安装,安装好显示“包 install ok”在这里插入图片描述在这里插入图片描述如果希望是在运行脚本的时候输入位置参数
若要./test1.sh httpd mysql-server php php-mysql

在这里插入图片描述函数返回值
1.函数的退出状态有两种方式
默认退出状态:函数的最后一条命令返回的退出状态
使用return命令:以特定的退出状态退出函数,但继续执行后边的命令,如果是exit命令,函数退出,脚本也退出
return命令只能用于函数内部
使用函数输出:直接将函数的结果赋值给变量

2.函数默认退出状态:函数的最后一条命令返回的退出状态在这里插入图片描述3.函数使用retun命令指定退出状态,只能用于函数返回值。在这里插入图片描述4.直接将函数的结果赋值给变量
变量名=$(函数名)在这里插入图片描述在这里插入图片描述日志函数
日志函数记录了函数执行是否成功的情况
演示日志函数在这里插入图片描述在这里插入图片描述注:if 后边的命令先执行再去返回命令状态返回值
效果显示在这里插入图片描述函数中的变量
函数使用两种变量
全局变量:在函数内部定义的变量,脚本主代码可以获取,脚本主代码定义变量,函数内部也可以获取
局部变量:local 变量名,确保变量仅在函数内部使用
local只能在函数内部使用在这里插入图片描述区分
脚本的变量
作用域:全局(继承到子进程,在当前进程和子进程都可以使用)和局部(只能在当前进程中使用)

函数的变量
1.作用域:全局(函数内定义的变量可以在另外函数内部使用,也可以在函数外使用,但只能在当前进程)和局部(只能在函数内部使用)

补充:在脚本中使用export声明是全局变量,使用ps -ef | grep bash 可以查看当前进程和子进程

函数库文件应用
1.函数库文件
如果多个脚本需要调用重复的函数,没必要在每个脚本中定义,只需要创建函数库文件,将需要的函数都放到这个库文件
每个脚本只需要一条语句调用库文件即可
注意不能把库文件当做普通脚本一样在脚本中运行,那样那些函数将不会出现在脚本中

在库文件中,只定义,不调用;可以定义变量,函数
在其他需要用到这些变量或者函数的脚本中调用。

2.创建库文件在这里插入图片描述3.在脚本中调用库文件(注意库文件的路径)推荐使用相对路径在这里插入图片描述4.还可以将库文件在.bashrc中定义
source /opt/lib.sh

5.全局函数可以在当前shell的所有子shell中随意运行
exprot -f port 将函数输出为全局函数

如果对你有帮助 记得点个赞再走哦

猜你喜欢

转载自blog.csdn.net/qq_43028054/article/details/90380966