美文网首页linux tools
Linux运维-day43-综合架构-shell编程基础扩展

Linux运维-day43-综合架构-shell编程基础扩展

作者: 文娟_狼剩 | 来源:发表于2019-05-30 14:22 被阅读39次

    一、shell编程基础扩展

    1.1 基本格式:

    #!/bin/bash
      #! 指定脚本用的命令解释器
    执行脚本
      sh:执行脚本
      sh -x:显示执行脚本的过程

    1.2 变量:

    临时存放数据的,方便脚本中重复使用

    1.2.1命名规则:

    看见变量的名称,就能知道变量的作用
    不能以数字开头

    1.2.2引号系列:

    单引号:所见即所得
    双引号:与单引号类似,能解析特殊符号`` () !
    不加引号:与双引号类似,可以支持通配符* {}
    反引号:优先执行里面的命令

    1.2.3变量分类:
    1>局部变量(普通变量)
    2>全局变量(环境变量)

    特点:
     系统创建,在大部分地方意思一样,都是大写
    env:可以系统中部分内置变量
    创建环境变量:在普通变量的前面加上export,如export aaa=123
    常用环境变量:
     PATH:记录命令的位置
     PS1:记录命令提示符的格式
     LANG:字符集语言

    1.2.4局部变量与环境变量的区别:

    局部变量只在当前环境使用,换了环境就失效
    环境变量无论哪里都可以使用

    https://www.processon.com/view/link/5a0e4380e4b06c8e10923353

    1.2.5特殊变量:

    $?:上一条命令的返回值,返回值为0模式正确
    $数字:表示脚本的第几个参数
    $0:表示脚本的名字
    $#:命令行参数的个数;判断参数的个数
    $*:脚本的所有参数

    [root@m01 ~]# cat ceshi.sh
    #!/bin/bash
    echo  $0  $1  $2
    
    x=$1
    y=$2
    
    awk -vn1=$x -vn2=$y 'BEGIN{print "jia:"n1+n2}'
    awk -vn1=$x -vn2=$y 'BEGIN{print "jian:"n1-n2}'
    awk -vn1=$x -vn2=$y 'BEGIN{print "cheng:"n1*n2}'
    awk -vn1=$x -vn2=$y 'BEGIN{print "chu:"n1/n2}'
    [root@m01 ~]# sh ceshi.sh 1000 25
    ceshi.sh 1000 25
    jia:1025
    jian:975
    cheng:25000
    chu:40
    [root@m01 ~]# 
    

    awk中参数-v的作用:命令行与awk的桥梁

    1.3判断

    1.3.1 特殊符号:

    &&:前1个命令执行成功,在执行后面的命令
    ||:前1个命令执行失败,在执行后面的命令

    1.3.2条件表达式:[ ]

    [ -d /tmp/aaa ] :判断目录是否存在
    [ -f /tmp/aaa ] :判断文件是否存在
    查询帮助命令:man test

    \\如果前面的目录存在,显示目录已存在
    [root@m01 ~]# [ -d /tmp/aaa ] && echo 'dir is exsit'
    \\如果前面的目录不存在,显示目录不存在
    [root@m01 ~]# [ -d /tmp/aaa ] || echo 'dir is not exsit'
    

    1.3.3 比大小
    与if判断语句相结合

        -eq:
            equal(等于)
            ==
        -ne:
            not equal(不等于)
            !=
        -gt:
            great than(大于)
            >
        -ge:
            great equal(大于等于)
            >=
        -lt:
            less than(小于)
            <
        le:
            less equal(小于等于)
            <=
    

    1.3.4 if条件判断
    格式:

    单分支判断
    双分支判断
    多分支判断

    #书写脚本comp.sh比较两个数字的大小
    注:exit 退出当前shell程序

    [root@m01 /server/scripts]# cat comp.sh 
    #!/bin/bash
    a=$1
    b=$2
    //-----------------------单分支判断-------------------
    if [ $# -ne 2 ]
    then
       echo "$0 num1 num2"
       exit   
    fi
    //-----------------------------------------------------
    //-----------------------双分支判断------------------
    if [ $a -gt $b ]
    then 
       echo "$a>$b"
    else 
       echo "$a<=$b"
    fi
    //----------------------------------------------------
    [root@m01 /server/scripts]# sh comp.sh 8 3
    a>b
    [root@m01 /server/scripts]# sh comp.sh 8 3
    8>3
    [root@m01 /server/scripts]# sh comp.sh 3 10
    3<=10
    [root@m01 /server/scripts]# sh comp.sh
    comp.sh num1 num2
    [root@m01 /server/scripts]# 
    
    [root@m01 /server/scripts]# cat comp.sh 
    #!/bin/bash
    a=$1
    b=$2
    //-----------------------多分支判断------------------
    if [ $a -gt $b ]
    then
       echo "$a>$b"
    elif [ $a -lt $b ] 
    then
       echo "$a<$b"
    else
       echo "$a==$b"
    fi
    //----------------------------------------------------
    [root@m01 /server/scripts]# sh comp.sh 22 45
    22<45
    [root@m01 /server/scripts]# sh comp.sh 22 4
    22>4
    [root@m01 /server/scripts]# sh comp.sh 33 33
    33==33
    [root@m01 /server/scripts]# 
    

    1.4 for循环

    [root@m01 /server/scripts]# cat forxunhuan.sh
    #!/bin/bash
    for day in {01..7}
    do
       echo "week$day 带小远去找 girl$day 跳舞"
    done
    
    [root@m01 /server/scripts]# sh xunhuan.sh 
    week01 带小远去找 girl01 跳舞
    week02 带小远去找 girl02 跳舞
    week03 带小远去找 girl03 跳舞
    week04 带小远去找 girl04 跳舞
    week05 带小远去找 girl05 跳舞
    week06 带小远去找 girl06 跳舞
    week07 带小远去找 girl07 跳舞
    [root@m01 /server/scripts]# 
    

    1.5 生产案例:判断定时任务是否运行中

    #判断定时任务是否运行中?(运行中显示crond is running,没有运行显示crond is guale)

    编写定时任务服务检查脚本
    如何判断crond服务是否运行中

    systemctl is-active crond
    systemctl status crond
    ps -ef|grep crond
    

    编写脚本

    [root@m01 /server/scripts]# cat check-service.sh 
    #!/bin/bash
    
    count=$( ps -ef|grep crond|grep -v 'grep'|wc -l)
    
    if [ $count -eq 1 ];then
       echo 'crond is running' 
    else
       echo 'crond is guale'
    fi
    
    \\\执行脚本
    [root@m01 /server/scripts]# sh check-service.sh 
    crond is running
    
    \\显示脚本的执行过程
    [root@m01 /server/scripts]# sh -x check-service.sh 
    ++ ps -ef
    ++ grep crond
    ++ grep -v grep
    ++ wc -l
    + count=1
    + '[' 1 -eq 1 ']'
    + echo 'crond is running'
    crond is running
    [root@m01 /server/scripts]# 
    

    二、作业

    2.1 #批量添加用户设置随机密码 for循环实现

    [root@oldboyedu /server/scripts]# cat  batch-adduser.sh
    #!/bin/bash
    . /etc/profile
    
    for item in {01..5}
    do 
       #pass=$(date +%N)
       pass=$(tr -cd 'a-zA-Z0-9' </dev/urandom| head -c8)
       username="ceshi$item"   
            
       useradd $username
       echo $pass|passwd --stdin $username
       echo $username":"$pass>>/etc/password.txt    
       
    done
    [root@oldboyedu /server/scripts]# 
    [root@oldboyedu /server/scripts]# tail -n5 /etc/passwd
    ceshi01:x:1014:1014::/home/ceshi01:/bin/bash
    ceshi02:x:1015:1015::/home/ceshi02:/bin/bash
    ceshi03:x:1016:1016::/home/ceshi03:/bin/bash
    ceshi04:x:1017:1017::/home/ceshi04:/bin/bash
    ceshi05:x:1018:1018::/home/ceshi05:/bin/bash
    

    2.2 #批量修改文件名字 for或rename

    比如:touch /oldboy/oldboy.txt 批量.txt修改为.jpg
    模拟环境

    [root@oldboyedu ~]# mkdir -p /oldboy/alex/
    [root@oldboyedu ~]# cd /oldboy/alex
    [root@oldboyedu /oldboy/alex]# touch oldboy{01..5}.txt
    [root@oldboyedu /oldboy/alex]# tree 
    .
    ├── oldboy01.txt
    ├── oldboy02.txt
    ├── oldboy03.txt
    ├── oldboy04.txt
    └── oldboy05.txt
    0 directories, 5 files
    [root@oldboyedu /oldboy/alex]#
    

    方法一:for循环

    方法二:rename

    [root@oldboyedu /oldboy/alex]# rename .txt .jpg /oldboy/alex/*.txt
    
    [root@oldboyedu /oldboy/alex]# tree
    .
    ├── oldboy01.jpg
    ├── oldboy02.jpg
    ├── oldboy03.jpg
    ├── oldboy04.jpg
    └── oldboy05.jpg
    
    

    相关文章

      网友评论

        本文标题:Linux运维-day43-综合架构-shell编程基础扩展

        本文链接:https://www.haomeiwen.com/subject/eycmtctx.html