zoukankan      html  css  js  c++  java
  • Shell:Day08.笔记

    函数:写一个代码块,用来重复调用的;
     1、函数的写法格式
     2、参数,在函数名后面直接加,即可;如果在外面
      abc(){
       函数体 $@
      }
      abc 1 2 3 4 5
      :wq
      
      a.sh 1 2 3 4 5 6
     3、变量
      local本地变量
      local i=1
      如果在函数体外同样也定义了一个相同的变量
      扩展:source / bash / chmod+x 全路径
       【父子进程的问题】
     4、return
      结束函数体的执行
      和exit 的却别
      return 和 exit 都指定的返回值 0 代表执行成功,1-255 代表执行失败
      return只用在函数体中;
     5、迭代
      迭代的时候一定要指初始值!!!
      n!
      n!=n(n-1)!
      fact(){
       if [ $1 -lt 1 -o $1 -eq 0 ];then
        echo 1
       else
        echo "$[$1*$(fact $[$1-1])]"
       fi
      }
      fact 100
     
      1 2 3 4 5 6  7   8
      1 1 2 3 5 8 13 21 34 ...  斐波那锲数列
      F(n)=F(n-1)+F(n-2)
      
      fab(){
       if [ $1 -eq 1 ];then
        echo 1
       elif [ $1 -eq 2 ];then
        echo 1
       else
        echo "$[$(fab $[$1-1])+$(fab $[$1-2])]"
       fi
      }
      fab 100
      fork炸弹:
      .(){
       . | . &
      }
      .
      .(){ .|.& };.  【研究一下别的语言的fork炸弹怎么写的】
    ==========================================================
    数组与字符串
    数组
     数组说白了就是一段连续的变量,一段连续的内存存储空间
     解决:变量过多的问题; 在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义;(列表)
      共好学院云三本[1]=张卓
      1、数组名
      2、索引
      3、值
     如何去定义数组:
      declare -i 定义整数 (申明)
      declare -a 定义数组array
      declare -A 定义嵌套的数组
       共好学院云[1]=云计算专业
       云计算专业[1]=云三班
       云三班[1]=张卓
       【这样数组值,在bash中并不常用】
      【python 和 shell】
      array=(值)
      array=()
     如何给数组赋值:
      array=()
      1、array[8]=张卓    (在计算机语言中,索引一般从0开始计算)
        (索引并不一定是数字 : key-value  array[张卓]=1.87m)
        (shell中数组赋值,可以跳跃(跳跃赋值))
      2、array=(/var/log/*.log)
       做遍历
            array=(a b c d e) 
      3、array=('张卓=187' '梁浩田=186' ... )
      4、通过read命令来赋值
       read -t 延迟 -p "指定说明" -a 输入数组所需的变量值
       read -a a b c d e
     如何去调用数组:
      ${变量名}
      ${数组名[索引]}  定义的是哪个索引,就看到是对应索引指定的值
      ${数组名}  默认调用 索引=0 的值  $array(最好不要这样写)
      ${数组名[*]} 或者 ${数组名[@]} 调用数组内所有的值 $* $@
            
      练习下: 统计 /var/log/*.log 中 索引为偶数 的文件 的行数的 和;
       a=(/var/log/*.log)
       for i in {0..7};do
        if [ $[$i%2] -eq 0 ];then
         line=`wc -l ${a[$i]} | cut -d' ' -f1`
         sum+=$line       # sum+=`wc -l ${a[$i]} | cut -d' ' -f1`   # sum+=$(wc -l ${a[$i]} | cut -d' ' -f1)
        fi
       done
       echo $sum
      
      1、调用数组的数组长度
      length("变量")
      ${#变量名[*]} 或者 ${#变量名[@]}
      2、添加数组值的特殊方式
      ${变量名[${#变量名[@]}]}="值" 或者  ${变量名[${#变量名[*]}]}="值"
      
     
     关于数组的其他操作
      数组切片
       ${变量名[@]:偏移量:所需要取出值的个数}
        echo ${a[*]:2:4}
       ${变量名[@]:偏移量} 
      删除值
       unset ${变量名[索引]} 
       注意:删除是索引所对的值,而没有带着索引一块删除;
       【知道值,如何查看索引?】
      修改值
       a[3]=c
       a[3]=d 覆盖即修改

     练习:
      生成10个随机数,打印其中最大的数值
      declare -a a
      declare -i max=0
       
      for i in `seq 0 9`;do
        a[$i]=$RANDOM
       [ ${a[$i]} -gt $max ] && max=${a[$i]}
      done
      echo ${a[@]}
      echo "最大值为:$max"
      生成10个随机数,并进行排序

    字符串:
     ==============================
     printf 
     name=张卓
     hiagth=183
     
     python  ( %s ,他的升高为 %d ) % (name, hiaght)
      输出: 张卓,他的升高为183
      %s
      %d
      %f
      
      %[num]s  指定该字符串占位的宽度
      %-[num]s  代表左对齐
       【居中对齐】
     =============================
      
     1、字符串切片:
      数组切片:${变量名[@]:偏移量:数值个数}
      字符串:${变量名:偏移量:数值个数}
                   ${变量名: -数值个数} 【*注意:冒号后面一定要加空格*】
                     ${变量名:-word}   默认赋值的意思
        read "sasasa:" test
        [ -z $test ] && test=abc
     2、基于模式取子字符串
      从左自右
      ${变量名#pattern}   删除pattern第一次匹配到的字串
      ${变量名##pattern}  删除所有pattern匹配到的字串
      
      从右自左
      ${变量名%pattern}
      ${变量名%%pattern}
      思考:取url中IP(域名)
     
     3、字符替换
      ${变量名/pattern/替换后的字符串} 【pattern并不是正则表达式,而是文件通配符】
       匹配第一个pattern,来进行替换
      ${变量名//pattern/替换后的字符串}
       匹配所有哦pattern,并进行替换
      ${变量名/#pattern/替换后的字符串}
       指定匹配行首必须是 pattern ,才会替换
      ${变量名/%pattern/替换后的字符串}
       指定匹配行尾必须是 pattern , 才会替换
      注意: /  分隔符,不能替换为(# % 等特殊字符 ,和sed 不一样)
     4、查找并删除
      替换中,不指定替换字符串,即为删除
      ${变量名/pattern}
      ${变量名//pattern}
      ${变量名/#pattern}
      ${变量名/%pattern}
     5、替换大小写
      tr  替换大小写
      tr [[:lower:]] [[:upper:]] < filename
      ${变量名^^}   将字符串全部替换为大写
      ${变量名,,}      将字符串全部替换为小写
     6、变量赋值
      变量名1=${变量名2:-word}  注意没有空格!   输入默认值的作用 , 变量2 没有值,就将 word 默认值赋值给 变量1
      变量名1=${变量名2:+word}  不常用   变量2 有值的情况下,才将 word默认值赋值给变量1
      ${变量:=word}   如果变量没有值,就将word赋值给变量,有值,则使用原来的值 
      变量1=${变量2:?error_infor}  如果变量2 没有值,输出erro_infor错误信息
       【不知道如何使用?】
     7、脚本应用其他文件中的变量,如何实现?
      filename1
      vim filename1
       a=1
       b=2
      :wq
      vim filename1.sh
       . /全路径/filename  后者  source /全路径/filename //执行整个代码
       c=$[$a+$b]
       ehco $c
      :wq
      bash filename1.sh
      
      练习:修改hostname,定义一个 hostname文件 name=xxx ,hostname.sh
       hostname
        name=test.com
       
       hostname.sh
       if [ -r /root/hostname ];then
        . /root/hostname
       else
        echo "/root/hostname 没有执行权限"
       exit 1
       fi
       hostname $name
     8、两个命令
      mktemp  创建临时文件以及目录  temp -- /tmp
       避免大家取的文件名字重复;mktemp 名字.XXXXXX (XX代表随机数(字母和数字))
       默认创建是随机的文件
       -d  创建的就是随机的 目录
       file=`mktemp a.XXXX`
      install   复制或删除文件,用法同copy
       优点可以指定权限来复制文件
       用法:intall a文件 b目录     //复制a文件到b目录,并回复初始权限(文件:755 目录:644)
                 -t   源目对换
                 -d  创建
                 -m MODE
                  -o OWNER
                 -g GROUP
     练习:
     1、获取此命令所依赖的所有库文件的列表
     Ldd /bin/cat
     2、复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
     /bin/bash  /mnt/sysroot/bin/bash
     /usr/bin/passwd  /mtn/sysroot/usr/bin/passwd
     3、复制此命令所依赖的所有库文件至目标目录下的对应路径下
     /lib64/ld-linux-x86-64.so.2  /mnt/sysroot/lib64/ld-linux-x86-64.so.2
     每次复制完成一个命令后,不要退出,而是提示用户输入新的复制的命令,并重复完成上述功能,直到用户输入quit退出;
     
  • 相关阅读:
    monit官方摘录
    monit配置文件
    monit检测语法
    monit介绍和配置
    ganglia-gmond.conf配置文件
    ganglia问题汇总
    ganglia使用nagios告警
    ganglia-gmetad 配置文件
    监控项目
    监控方案
  • 原文地址:https://www.cnblogs.com/why098/p/11385650.html
Copyright © 2011-2022 走看看