函数基础
函数:模式化编程:最大化的代码重用,最小化的代码冗余
函数:function,功能组件
可被调用:函数有函数名
函数出现的地方,而自动被替换成函数定义的代码
函数定义
语法:
FuncName() { function FuncName {
函数体 函数体
} }
函数定义好以后,被调用时才执行函数体内容
函数有两种返回值:
执行结果:正常程序输出
状态结果:函数体中调用命令的输出结果
函数的退出状态码:
return 从函数中返回,用最后一条命令的退出状态码
return 0 无错误返回
return 1-255 有错误返回
函数可以接收参数:
在函数体可以使用类似脚本调用位置参数一样的参数
函数调用(函数在使用前必须定义,调用函数仅使用其函数名即可)
载入函数: source 函数脚本 或 . FuncName (注:载入函数时文件路径要填写完整)
查看函数:declare -xf FuncName
删除函数:unset FuncName
调用函数:FuncName
调用并传递参数:FuncName $1
定义全局函数:export -f FuncName
查看全局函数:export -xf FuncName
函数变量作用域
变量在声明的位置决定了其作用域
环境变量:当前shell和子shell有效(子shell赋值并不影响父级进程)
本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程;因此,本地变量的作用范围是在当前shell脚本程序文件,包括脚本中的函数
局部变量:函数的周期生命;函数结束时变量被自动销毁
local NAME=VILUE 函数内部有效
函数递归
函数直接或间接调用自身,注意递归层数
小结:
传递给脚本的参数,函数本身并不调用
只有传递给函数以后 ,函数体才能调用传递给脚本的参数
在函数中使用了在主程序中声明的变量,重新赋值会直接修改主程序中的变量
如果不期望函数与主程序中的变量冲突,函数中使用变量都用local修饰,
在函数中使用了在主程序中没有声明的变量,在函数执行结束后即被撤销
—————————————————————————————————————————-
数组:储存多个元素的连续的内存空间,相当于多个变量的集合
数组名和索引
索引:编号从0开始,属于数值索引
索引可支持使用自定义格式,而不仅是数值格式,自定义格式的就叫关联数组
声明数组:注:两者不可相互转换
declare -a arrayName
declare -A arrayName(关联数组)
初始化或赋值:各元素之间使用空白字符隔开
语法:
arrayName[0]=’a’;arrayName[1]=’b’ #按照下标单个赋值
arrayName=(‘a’ ‘b’ ‘c’) #一次赋值全部元素,以空格隔开
arrayName=([index]=’a’ [index]=’b’) #按照索引赋值,(稀疏格式用)
read -a arrayName #交互式赋值
显示所有数组:declare -a
${#arrayName[@]},${#arrayName[*]} #获取数组中有效元素的个数
${#arrayName[index]} (index=0,1,2….) #获取某一元素中字符串的长度
引用数组
引用数组元素: ${arrayName[index]}
引用数组所有元素: ${arrayName[*]} 或者 ${arrayName[@]}
数组中元素的个数: ${#arrayName[*]} 或者 ${#arrayName[@]}
删除数组
删除数组的某元素: unset arrayName[index]
删除整个数组: unset arrayName
引用数组中的元素:
数组切片: ${arrayName[@]:要跳过的元素个数:要取出的元素个数}
取偏移量之后的所有元素 ${arrayName[@]:要跳过的元素个数}
向数组中追加元素: arrayName[${arrayName[*]}]=value
关联数组:关联数组必须先声明再调用
declare -A arrayName
arrayName=([index]=’a’ [index]=’b’)
—————————————————————————————————————————-
字符串切片
${#name}: 返回字符串长度
${name:3}: 从3开始返回字符串(位偏移)
${name:3:4}: 从3开始从左向右取4位
${name:-3}: 最后3位的字符串
${name:3:-4}: 从第3位开始 至最后倒数4位为止
${name: -4:-2}: 从右往左取4位,然后在从后往前取2位 (ContOS7可运行)
基于模式取字符串
${name#*word}: word可以是指定字符串,查找从字符串中word(查找1次)开头往右的所有内容
${name##*word}: word可以是指定字符串,查找从字符串中word(查找所有)开头往右的所有内容
${name%word*}: 从右至左开始查找(查找1次)
${name%%word*}: 从右至左开始查找(查找所有)
查找替换
${name/1/2}: 从左边至右查找1,替换为2(替换1次)
${name//1/2}: 从左边至右查找1,替换为2(替换所有)
${name/#1/2}: 从左边至右查找1,替换为2
${name/%1/2}: 从右边至左查找1,替换为2
查找删除
${name/1/2}: 从左边至右查找1(查找1次),删除1及之后的内容
${name//1/2}: 从左边至右查找1(查找1次),删除1及之后的内容
小结
*表示所有字符串内容,放在首部表示从左往右,放在尾部表示从右往左
#表示字符串开头,%表字符串结尾
如需要全部替换字符串内容(贪婪模式)需输入2次,例:## //
变量赋值
根据一个字符串的状态情况赋值给另外一个字符串(相当于简单的if判断)
有类变量:shell里变量默认都是无类型变量
declare命令:指定变量类型
语法:declare [选项]变量名
-r: 声明或显示只读变量
-i: 将变量定义为整形数
-a: 将变量定义为数组
-A: 将变量定义为关联数组
-f: 显示已定义的所有函数名及其内容
-F: 仅显示已定义的所有函数名
-x: 声明或显示环境变量和函数
-l: 声明变量为小写字母
-u: 声明变量为大写字母
eval命令:扫描命令里是否有变量,替换为变量值.在执行命令
间接变量引用
如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值
第二个变量可以为命令
例: num=`echo {1..10}|tr ” ” “+”|bc`
sum=$num
echo $sum
sum=55
mktemp命令:创建临时文件
语法:mktemp [选项] nameXXX 注:XXX为随机字符至少指定3位
选项:
-d 创建临时目录
-p 指定临时文件所存放的目录
install命令:安装复制文件
语法:install [选项]
参数:
-d: 创建文件夹
-t: 创建空文件夹
选项:
-m: 指定权限,默认755
-o: 指定用户,所有者
-g: 指定组,所属组
expect工具:主要应用于自动化交互式操作的场景,适用于对多台服务器执行相同操作
yum install expect需要安装包
语法:expect (tcl语言 模式 动作)
选项:
-c:从命令行执行expect脚本, 默认交互执行
-d:可以输入输出调试信息
expect中相关命令
spawn:启动新的进程
send:用于向进程发送字符串
expect:从进程接收字符串 期望收到\t(回车)
interact:允许用户交互
exp_continue:匹配多个字符串在执行动作后加此命令
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98252