函数
基础概念
在编写脚本时,有些脚本可以反复使用,可以调用函数来解决
语句块定义成函数约等于别名
函数使用方法:
定义函数
再引用函数
基本格式
1.
function 函数名 {
命令序列
}
2.
函数名(){
命令序列
}
函数中调用函数 直接写函数名即可
同名函数 最后出现的生效
调用函数一定要先定义
只要先定义了调用的 其他函数定义顺序无关
基础操作
查看函数
declare -F
删除函数
unset func_name函数名称
函数的返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
使用原则;
-
函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
-
退出码必须是0-255,超出的值将为除以256取余
-
函数的传参数
-
函数名 参数1 参数2 ...参数n
-
函数在shell脚本中仅在当前的shell环境中有效
shell脚本中函数的变量默认全局有效
将变量限定在函数内部使用local命令
-
函数的作用范围
加上local变量即可将变量限制在函数内
[root@localhost ~]name=qian
[root@localhost ~]func1 () { name=li ; echo $name; }
[root@localhost ~]func1
li
[root@localhost ~]echo $name
li
[root@localhost ~]name=qian;func1 () { local name=li ;echo $name; };echo $name
加上local变量即可将变量限制在函数内
-
递归函数
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]
then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
数组
分为两种
- 普通数组 普通数组以数字为下标
- 关联数组 关联数组,不以数字为下标,可以使用字符串或字符为下标
数组名和索引
-
索引的编号从0开始,属于数值索引
-
索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持
-
bash的数组支持稀疏格式(索引不连续)
声明数组
#普通数组可以不事先声明,直接使用
declare -a ARRAY_NAME
#关联数组必须先声明,再使用
declare -A ARRAY_NAME
基础类型
定义数组格式:
1. 数组名=(value0 value1 value2 value3 ......)
2. 数组名=([0]=value [1]=value1 [2]=value2 ....)
3. 列表名="value0 value1 value2 value3 ...... "
数组名=($列表名)
4. 数组名[0]="value1"
数组名[1]="value2"
数组名[2]="value3"
数组的包括数据类型
- 数值型
- 字符型
- 混合型数值加字符
使用" "或' '定义单引号或双引号括起来
冒泡排序
5 -1= 4 才能比出最大值
a=(70 40 30 60 50) 30 40 50 60 70
tmp=40
a[1]=70 ${a[0]}
a[0]=$tmp
冒泡 是通过数字比较 将大的数往后排 小的数往前面排
5个数字 5-1=4 需要比较4轮 才能知道每一个数字的具体位置
a=(70 40 30 60 50)
轮次 总个数 需要比较的数 比几次 找到的数
第1轮 5 5个数 比4次 找到最大数
第2轮 5 4个数 比3次 找到第二大数
第3轮 5 3个数 比2次 找到第三大的数
第4轮 5 2个数 比1次 找到第四大的数
免交互
定义
使用I/O重定向的方式将命令列表提供给交互式程序
标准输入的一种替代品
Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出一个文件并用作命令的标准输入,Here Document 可以与非交互式程序和命令一起使用
语法格式
命令<< 标记
....
......
标记
1. 标记可以使用任意的合法字符(通用的字符是EOF)
2. 结尾的标记一定要顶格写,前面不能有任何字符(包括空格)
3. 结尾的标记后面也不能有任何字符(包括空格)
4. 开头标记前后空格会被省略掉
示例
[root@localhost ~] read -p "请输入一个数字" ack
请输入一个数字8
[root@localhost ~] echo $ack
8
[root@localhost ~] read i <<EOF
> hi
> EOF
> echo $i
EOF 支持重定向
如
read i <<EOF >> bak
expect
定义:
是建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
-
spawn 启动新的进程(监控,捕捉)
spawn passwd root
-
expect 从进程接收字符串
-
send 用于向进程发送字符串
-
exp_continue 匹配多个字符串在执行动作后加此命令
-
interact 允许用户交互expect eof