shell进阶函数及数组

①函数
②数组
③字符串切片
④变量高级进阶
⑤expect工具

函数基础
          函数:模式化编程:最大化的代码重用,最小化的代码冗余
          函数: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判断)
clipboard
有类变量: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

发表评论

登录后才能评论

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班