zjp0633 发表于 2018-8-28 07:41:03

4、Shell函数,Shell数组,变量替换

  定义函数
  function 函数名 {
  函数的功能体
  ......
  }
  函数名(){
  函数的功能体
  ......
  }
  如何调用函数
  函数名
  函数的使用规则?
  1)先定义后调用,可以只定义不调用
  2)定义放上面,调用放下面
  3)函数名区分大小写
  4)函数名相同,后定义的生效
  5)函数名不准使用特殊符号和关健字
  6)在函数体内定义的变量叫局部变量,只能在当前函数内使用
  7)在函数体外定义的变量叫全局变量
  8)在第二个函数里敲上第一个函数的函数名,这样可以调用第一个函数的变量
  例
  #!/bin/bash
  pri() {
  echo "Hello"
  }
  pri
  函数传值
  pri(){
  echo $#
  echo $*
  echo $1
  echo $2
  }
  pri 20 40
  #!/bin/bash
  sum_two(){
  sum=`expr 2 +3`
  echo "1 + 2 = $sum "
  }
  sum_two #只能计算2+3的和
  函数递归调用
  fork炸弹 .(){.|.&};.
  分析
  1 .()
  2 {
  3 .|.&
  4 }
  5 ;
  6 .
  数组:
  用一个变量存储一组数据,并且能够对这组数据中的某个数据单独操作
  数组类型: 一维数组 二维数组 多维数组
  *
  declare 定义变量时指定变量的类型,默认变量的类型都是字符类型的
  格式1
  declare 选项 变量名
  变量名=值
  格式2
  declare 选项 变量名=值
  选项
  -i整数变量
  -x环境变量
  -r只读变量,定义的变量名不允许再修改
  -a数组变量
  例1:
  declare -i a=10 b=20
  declare -i c=a*b
  echo c
  例2:
  declare -r name=wsyht
  name=peter
  例3:
  declare -a array   #定义数组
  declare -a | grep array#查看数组
  array=(jim tom jerry lucy)      #定义数组元素
  echo ${array}#输出数组元素
  array=yht#如果元素下标值没有被已有元素使用,是向数组中添加新元素
  array=tom#如果元素下标值已被已有元素使用,是修改已有元素的值
  array=()#如果给数值赋值时,元素列表为空,是删除数组中的所有元素
  array=(baidu 163 360)#如果给数组赋值时,元素列表里输入新值,是重新给数组赋值
  显示定义数组 declare -a 数组名
  echo ${TEST[@]}         #输出元素的值
  2 3 4 5 6 7 8 9 10 11
  echo ${!TEST[@]}      #输出元素的下标
  0 1 2 3 4 5 6 7 8 9
  echo ${#TEST[@]}      #输出元素的个数
  10
  给数组变量赋值的方式:
  方法1
  数组名=(数组元素列表)
  array=(jim tom jerry lucy)   #定义数组元素
  方法2
  数组名[元素下标]=值
  array=yht
  使用数组元素
  ${数组名[元素下标]}
  echo ${array}
  操作数组元素相关的命令
  输出数组里的所有元素
  echo ${host[@]}
  echo ${host
[*]}
  输出数组元素个数
  echo ${#host[@]}
  echo ${#host
[*]}
  输出连续的某几个数组元素
  num=(a b c d e f g h i j k)
  echo ${num[@]:3}    #从下标是3的元素开始显示,后面不写,表示默认显示到最后
  echo ${num[@]:3:5}#从下标是3的开始显示,显示5个
  echo ${num[@]:3:}   #从第三个开始显示,显示0个
  echo ${#host}   #输出元素下标为0的元素个数
  输出某个数值的一部分
  echo ${host}    #输出某个元素的值
  www.baidu.com
  echo ${host:3}   #从数组元素值的和四个字符开始显示,显示到末尾,
  .baidu.com
  echo ${host:0}#从第一个字符开始显示,一直显示到最后
  www.baidu.com
  echo ${host:0:3} #从第一个字符开始显示,共显示3个字符
  .baid
  输出数组元素
  输出某个数组元素的长度
  - echo ${数组名字[下标]}
  输出数组元素值的一部分
  - echo$(#数组名[下标]:起始:字符数)
  例子
  server=(www.baidu.com www.163.com)
  echo $(#server[@])
  echo $(#server)
  wall "error" 向所有终端发警告信息,双引号里注明的是警告信息
  Shell的变量替换(改变变量赋值的方式)
  $(变量名 变量替换符 用户自定义字串)
  :-
  如果name存在且非null 则返回其值;否则返回word
  用途:如果变量没定义,反回默认值
  例:
  #name=tom
  #echo $name
  tom
  #y=$(name:-plj)
  #echo $y
  tom
  #unset name
  #y=${name:-plj}
  $echo $y
  plj
  :=
  $(name:=word)
  如果name存在且非null则返回他的值;否则设置他为word并返回其值
  用途:如果变量没定义,则给变量赋值
  例:
  #x=$(name:=100)
  #echo $x
  100
  #echo $name
  100
  #name=200
  #x=${name:=100}
  #echo $x
  200
  :+
  如果name存在且非null,则返回word;否则返回null
  用途:测试变量是否定义
  #name=jim
  #echo $name
  #a=${name:=is ok}
  #echo $a
  is ok
  #unset name
  #a=${name:=is ok}
  #echo $a
  :?
  $(name:?word)
  如果name存在且非null则返回他的值;否则显示name:word并退出当前的命令或脚本
  若省略word则显示name:parameter null or not set
  用途:捕捉由于变量未定义所导致的错误
  #name=plj
  #echo $(name:?undefined)
  pkj
  #unset name
  #echo $(name:?undefined)
  bash:name:undefined
  #echo $(name:?)
  bash:name:parameter null or not set
  number=$(n:=100)
  :-
  :+
  :?
  获取普通变量值的一部分数据
  ${变量名 替换符号 被替换的源数据表达式}
  #从左向右最短匹配删除,返回删除后剩下的数据
  例:
  #echo MAIL
  /var/spool/mail/root
  #mailidir=${MAIL#*/}
  #echo $maildir            //最短匹配,匹配到第一个/
  var/spool/mail/root
  ##从左向右最长匹配删除,返回删除后剩下的数据
  例:
  #echo $MAIL
  /var/spool/mail/root
  #echo ${MAIL##*/}      //最长匹配,匹配到最后一个/
  root
  #maildir=${MAIL##*/}
  echo $maildir
  root
  %从右向左最短匹配删除,返回删除后剩下的数据
  例:
  #echo $MAIL
  /var/spool/mail/root
  #maildir=$(MAIL%r*)
  #echo $maildir
  /var/spool/mail/
  %%从右向左最长匹配删除,返回删除后剩下的数据
  例:
  #echo $MAIL
  /var/spool/mail/root
  #maildir=${MAIL%%/*}
  echo $maildir

页: [1]
查看完整版本: 4、Shell函数,Shell数组,变量替换