设为首页 收藏本站
查看: 684|回复: 0

shell编程函数与数组

[复制链接]

尚未签到

发表于 2018-8-24 13:22:44 | 显示全部楼层 |阅读模式
  shell编程函数与数组
  1、shell中函数
  (1)shell中函数的语法
  语法一:
  函数名(){
  指令
  return n
  }
  语法二:
  function 函数名(){
  指令
  return n
  }
  (2)shell中函数的调用执行
  1)直接执行函数名即可,在执行函数时,不要带小括号,函数定义及函数体必须要在执行的函数名前定义。
  2)带参数的函数的执行方法:函数名  参数1  参数2
  (3)函数带参数的说明
  1)在函数体重,位置函数都可以是函数的参数
  2)父脚本的参数在函数中则临时地被函数参数所掩盖或隐藏
  3)$0比较特殊,他任然是父脚本的参数,
  4)在shell函数里面,return命令的工作方式与exit相同,用于跳出函数。
  5)在shell函数里使用exit会终止整个shell脚本。
  6)return语句会返回一个退出值给调用的程序
  (4)递归:函数直接或间接的调用自身进行计算
  1)递归求阶乘
#!/bin/sh  
function jc(){
  
  if [ $1 -eq 1 ]
  
    then
  
        echo "1"
  
   else
  
        echo $[ $1*$(jc $[$1-1]) ]
  
    fi
  
}
  

  
jc $1
  2)递归求斐波那契数列第N项的值
#!/bin/bash  
function ad(){
  
    if [ $1 -eq 1 ]
  
        then
  
        echo "1"
  
    elif [ $1 -eq 2 ]
  
        then
  
        echo "1"
  
    else
  
        echo $[ $(ad $[$1-1])+$(ad $[$1-2])]
  
    fi
  
}
  

  
ad $1
  2、数组
  (1)数组:存储多个元素的连续内空间间,相当于多个变量的集合
  (2)数组的创建与声明:
  1)定义一个数组:array=(“dayi123” 19)
  2)声明一个数组:
  声明索引数组:declare –a arrname
  声明关联数组:declare –A arrname
  [root@dayi123 ~]#arr1=("dayi123" 13 "string")    #创建一个数组
  [root@dayi123 ~]#declare -a arr2     #声明一个数组
  [root@dayi123 ~]#arr2[0]="dayi"     #往数组中添加元素
  [root@dayi123 ~]# arr2[1]="18"
  (3)获取数组的长度
  echo ${#array[@]}
  echo ${#array
  • }
      [root@dayi123 ~]# echo${#arr1[@]}  #打印数组中元素个数
      3
      [root@dayi123 ~]# echo${#arr2
  • }   #打印数组中元素个数
      1
      (4)打印数组的元素
      echo ${array[n]}
      echo ${array[@]}
      echo ${array
  • }
      [root@dayi123 ~]# echo${arr1[1]}    #打印数组arr1中的第2个元素
      13
      [root@dayi123 ~]# echo${arr1[0]}    #打印数组arr1中的第1个元素
      dayi123
      [root@dayi123 ~]# echo${arr1[@]}   #打印数arr1中的所有元素
      dayi123 13 string
      [root@dayi123 ~]# echo${arr2
  • }    #打印宿主arr2中的所有元素
      dayi123 22
      (5)数组的赋值
      数组的赋值:array[3]=4
      修改数组元素:arrary[0]=”liuyi”
      [root@dayi123 ~]#arr1[3]=4
      [root@dayi123 ~]#arr1[0]="liu"
      [root@dayi123 ~]# echo${arr1
  • }
      liu 13 string 4
      (6)数组内容的截取
      echo ${arr1[@]:n:m}      #截取第n个到第m个元素
      [root@dayi123 ~]# echo${arr1
  • :1:2}
      13 string
      (7)数组内容的替换
      echo ${arr1[@]/n/m}      #将数组中的第一个n替换为m
      [root@dayi123 ~]# echo${arr1
  • /"liu"/"dayi123"}
      dayi123 13 string 4dayi123
      (8)数组的删除与数组中元素的删除
      unset array   #删除整个数组
      unset array[n]  #删除数组中第n个元素,删除一个元素时只能从头开始一个一个删除
      [root@dayi123 ~]# unsetarr1[0]  #删除数组中第一个元素
      [root@dayi123 ~]# echo${arr1
  • }
      13 4 liu
      [root@dayi123 ~]# unsetarr1[2]   #直接删除数组中第二个元素,删不掉
      [root@dayi123 ~]# echo${arr1
  • }
      13 4 liu
      [root@dayi123 ~]# unsetarr1[1]   #删除数组中第一个元素,因为第0个元素已经删除
      [root@dayi123 ~]# echo${arr1
  • }
      4 liu
      [root@dayi123 ~]# unsetarr1     #删除整个数组
      [root@dayi123 ~]# echo${arr1
  • }
      [root@dayi123 ~]#
      (9)数组使用案例:
      1)生成10个随机数,找出其中的最大值
    #!/bin/sh  
    declare -a rand
      
    declare -i max=0
      
    for i in {0..9};do
      
            rand[$i]=$RANDOM
      
            echo ${rand[$i]}
      
            [ ${rand[$i]} -gt $max ] &&max=${rand[$i]}
      
    done
      

      
    echo "max is$max"
      2)定义一个数组,数组中元素是/var/log目录下所有以.log结尾的文件,统计其下标为偶数的文件中的行数之和
    #!/bin/sh  

      
    declare -a files
      
    files=(/var/log/*.log)
      
    declare -i lines=0
      

      
    for a in $(seq 0$[${#files
  • }-1]);do
      
            if [ $[$a%2] -eq 0 ];then
      
                let lines+=$(wc -l ${files[$a]} |cut -d ' ' -f1)
      
            fi
      
    done
      
    echo"lines:$lines"
      3、变量字符串的操作
      (1)获取长度
      echo ${#variable}
      echo $variable | wc –l
      [root@dayi123 ~]#DAYI="i am dayi123"
      [root@dayi123 ~]# echo${#DAYI}
      12
      [root@dayi123 ~]# echo$DAYI | wc -L
      12
      (2)截取字符串子串
      echo ${variable:n}        #从第n个字符开始截取
      echo ${variable:n:m}      #从第n个字符串始截取m个字符
      echo $variable | cut –c n-m  #从第n个字符开始截取m个字符
      [root@dayi123 ~]# echo${DAYI:2}
      am dayi123
      [root@dayi123 ~]# echo${DAYI:2:5}
      am da
      [root@dayi123 ~]# echo$DAYI | cut -c 2-5
      am
      (3)替换操作
      echo ${variable/char1/char2}    #将字符串中的char1替换为char2,只替换第一个
      echo ${variable//char1/char2}   #将变量中的所有字符串char1替换为char2
      [root@dayi123 ~]#DAYI="dayi123DAYIdayi"
      [root@dayi123 ~]# echo${DAYI/dayi/liu}     #将第一个dayi替换为liu
      liu123DAYIdayi
      [root@dayi123 ~]# echo${DAYI//dayi/liu}    #替换所有的dayi为liu
      liu123DAYIliu
      (4)删除操作
      echo ${variable#char1}     #从头开始删除匹配到的char1
      echo ${variable#a*c}       #删除第一次匹配到的a*c之间的内容
      echo ${variable##a*c}      #删除匹配到最长的a*c之间的内容
      echo ${variable%a*c}     #从结尾开始删除匹配到最短的a*c之间的内容
      echo ${variable%%a*c}    #从结尾开始删除匹配到最长的a*c之间的内容
      [root@dayi123 ~]# echo$DAYI
      dayi123DAYIdayi
      [root@dayi123 ~]# echo${DAYI#dayi}    #删除第一个匹配到的dayi
      123DAYIdayi
      [root@dayi123 ~]# echo${DAYI#d*i}    #删除匹配到的d*i之间的内容
      123DAYIdayi
      [root@dayi123 ~]# echo${DAYI##d*i}  #删除匹配到的最长的d*i之间的内容
      [root@dayi123 ~]# echo${DAYI%d*i}   #删除从结尾匹配到的d*i之间的内容
      dayi123DAYI
      [root@dayi123 ~]# echo${DAYI%%d*i}  #删除从结尾匹配到的最长的d*i的内容
      [root@dayi123 ~]# echo${DAYI%%dayi}  #删除从结尾匹配到的dayi
      dayi123DAYI
      (5)字符的大小写替换
      echo ${variable^^}     #将变量中的小写字符替换为大写
      echo ${variable,,}       #将变量中的大写字符替换为小写
      [root@dayi123 ~]# echo${DAYI^^}
      DAYI123DAYIDAYI
      [root@dayi123 ~]# echo${DAYI,,}
      dayi123dayidayi
      (6)变量的测试
      ${variable:-char}  #如果变量存在且非空,则返回变量的值,否则返回char
      ${variable:=char}  #如果变量名存在且非空,则返回变量值,否则设置variable的值为char,并返回其值
      ${variable:+char}  #如果变量存在则返回CHAR,否则返回空值
      [root@dayi123 ~]# echo${DAYI:=HELLO}   #变量DAYI存在,所以返回变量DAYI的值
      dayi123DAYIdayi
      [root@dayi123 ~]# echo${LIU:=HELLO}    #变量LIU不存在,所以返回HELLO,并赋值给LIU
      HELLO
      [root@dayi123 ~]# echo$LIU
      HELLO
      [root@dayi123 ~]# echo${DAYI:-HELLO}  #变量DAYI存在,返回DAYI的值
      dayi123DAYIdayi
      [root@dayi123 ~]# echo${YI:-HELLO}    #变量YI不存在,所以返回HELLO,但并没有赋值
      HELLO
      [root@dayi123 ~]# echo$YI
      [root@dayi123 ~]# echo${DAYI:+HELLO}   #变量DAYI存在,所以返回HELLO
      HELLO
      [root@dayi123 ~]# echo${hehe:+HELLO}  #变量hehe不存在,所以返回空
      [root@dayi123 ~]#
      4、补充一些小命令
      (1)创建临时文件和目录
      用法:mktemp filename.XXXX   创建并系那是临时文件
      选项:-d  创建临时目录
      注:X必须为大写,而且数量不小于三
      [root@dayi123 script]#mktemp /tmp/dayi.XXXX
      /tmp/dayi.dA5h
      [root@dayi123 script]#mktemp -d /tmp/dayi123.XXXX
      /tmp/dayi123.jkIq
      (2)install命令
      作用:复制文件并设置属性
      用法:install [选项] sourcefile  dfile
      选项:-m  指定权限,默认755
      -o   指定属主身份
      -g   指定属组身份
      -d   创建空目录
      [root@dayi123 script]#install -m 755 -o dayi123 -g dayi123 trap.sh trap1.sh [root@dayi123 script]# lltrap1.sh
      -rwxr-xr-x. 1 dayi123dayi123 242 Apr 10 21:29 trap1.sh
      5、捕捉信号trap
      (1)作用:用于指定在接受到信号后将要采取的动作,常见的用途是在脚本程序被中断时完成清理工作
      (2)用法:
      1)trap '触发指令' 信号
      自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作
      2)trap '' 信号
      忽略信号的操作
      3)trap '-' 信号
      恢复原信号的操作
      4)trap -p
      列出自定义信号操作
      (3)案例:
      案例1:当按下ctrl+c时终止ping,捕捉信号并进行操作
    #!/bin/sh  
    trap 'echo"stop"' INT
      
    ping 172.16.0.1
      案例2:测试一个网段的主机,当按下ctrl+c时中断测试
    #!/bin/sh  
    trap 'echo"stop";exit 1' INT
      
    for(( i=1;i/devl/null;
      
          then
      
            useradd $username
      
            pass=`dialog --stdout --backtitle 'adduser' --title 'password' --inputbox "please input password:" 20 40`
      
            echo $pass | passwd --stdin $username
      
            dialog --backtitle 'add user' --title'title' --msgbox "add user $username successful" 10 20
      
         else
      
            dialog --backtitle 'add user' --title'add user' --msgbox "$username is already create" 10 20
      
          fi
      
    fi
      
    done



  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-556017-1-1.html 上篇帖子: Linux Shell——函数的使用 下篇帖子: shell处理mysql增、删、改、查
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表