一、回顾:循环
1、循环控制:break,continue
2、while,for循环的特殊用法
3、for (());do
循环体
done
4、while read VARAIBLE;do
循环体
done < /PATH/FROM/SOMEFILE
二、bash脚本编程
1、case语句
a、多分支if语句:
if CONDITION1;then
分支1
elif CONDITION2;then
分支2
...
else CONDITION;then
分支n
fi
b、实例
(1)实例1:显示一个菜单给用户
cpu) display cpu infomation
mem) display memory infomation
disk) display disks infomation
quit) quit
要求:
1)、提示用户给出自己的选择
2)、正确的选择则给出相应的信息,否则,则提示重新选择正确的选项
2、case语句的语法格式
a、语法格式
case $VARAIBLE in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
分支n
;;
esac
b、上述示例
c、示例:写一个服务框架脚本
$lockfile,值为/var/lock/subsys/SCRIPT_NAME
(1)、脚本可接受start,stop,restart,status四个参数之一
(2)、如果参数非此四者,则提示使用帮助后退出
(3)、start,则创建lockfile,并显示启动;stop;则删除lockfile,并显示停止;restart,则先删除此文件再创建此文件,而后显示重启完成;status,如果lockfile存在则显示running,否则,则显示为stopped
3、case总结
a、case支持glob风格的通配符
*:任意长度的任意字符
?:任意单个字符
[]:范围内任意单个字符
a|b: a或b
三、函数:function
1、过程式编程:代码重用
a、模块化编程
b、结构化编程
c、把一段独立功能的代码当做一个整体,并为之取一个名字;命名的代码段,此即为函数
注意:定义函数的代码段不会自动执行,在调用时执行;所谓调用函数,即在代码中给定函数名即可,函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码
2、定义函数
a、语法一
function f_name {
...函数体...
}
b、语法二
f_name() {
...函数体...
}
c、函数的生命周期:每次被调用时创建,返回时终止
(1)、其状态返回结果为函数体中运行的最后一条命令的状态结果
(2)、自定义状态返回值,需要使用:return
return[0-25]
0:成功
1-255:失败
3、示例
a、给定一个用户名,取得用户的id号和默认shell
(1)、方式1
(2)、方式2
(3)、我们现在来重复使用
b、重写前面的服务脚本框架
4、函数返回值
a、函数的执行结果返回值
(1)、使用echo或printf命令进行输出
(2)、函数体中调用的命令的执行结果
b、函数的退出状态码
(1)、默认取决于函数体中执行的最后一条命令的退出状态码
(2)、自定义:return
5、函数可以接受参数
a、传递参数给函数
(1)、在函数体当中,可以使用$1,$2,...引用传递给函数的参数,还可以在函数中使用$*或$@引用所有参数,$#引用传递的参数的个数
(2)、在调用函数时,在函数名后面以空白符分隔给定参数列表即可,例如,testfunc arg1 arg2 arg3...
b、实例
(1)、添加10个用户,添加用户的功能使用函数实现,用户名作为参数传递给函数
6、练习题
a、使用函数实现ping一个主机来测试主机的在线状态,主机地址通过参数传递给函数
主程序:测试172.16.1.1-172.16.67.1范围内各主机的在线状态
b、写一个脚本,实现打印NN乘法表;
四、变量作用域
1、局部变量:作用域是函数的生命周期;在函数结束时被自动销毁
a、定义局部变量的方法:local VARIABLE=VALUE
2、本地变量:作用域是运行脚本的shell进程的生命周期,因此,其作用范围为当前shell脚本程序文件
a、实例1
b、实例2
五、函数递归
1、函数直接或间接调用自身
a、经典场景
b、菲薄拉些数列实现