shell脚本 之 函数 和 免交互

函数

基础概念

在编写脚本时,有些脚本可以反复使用,可以调用函数来解决

语句块定义成函数约等于别名

函数使用方法:

定义函数

再引用函数

基本格式

1.

function 函数名 { 

命令序列

}

2.

函数名(){

命令序列

}

 函数中调用函数 直接写函数名即可

同名函数 最后出现的生效

调用函数一定要先定义 

只要先定义了调用的 其他函数定义顺序无关

基础操作

查看函数

declare -F

删除函数

unset    func_name函数名称  

函数的返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值

使用原则;         

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码

  2. 退出码必须是0-255,超出的值将为除以256取余

  3.  

    函数的传参数

  4. 函数名   参数1  参数2  ...参数n

  5.  

     

    函数在shell脚本中仅在当前的shell环境中有效

    shell脚本中函数的变量默认全局有效

    将变量限定在函数内部使用local命令

  6. 函数的作用范围

加上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变量即可将变量限制在函数内

  1. 递归函数 

#!/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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值