zoukankan      html  css  js  c++  java
  • Linux shell 脚本(二)

    转载请标明出处: 
    http://blog.csdn.net/zwto1/article/details/45078837; 
    本文出自:【明月的博客】   


    五、字符串处理

    1.子串截取操作
    路径分割:
     dirname命令:定位目标所在文件夹的位置 
     basename命令:目标对象的名字,通常指的指的是文件名或者最底层的目录名
    使用expr命令
      格式:expr substr $Var1 起始位置 截取长度
    使用${}表达式
      格式:${Var1:起始位置:截取长度}
     
    例子:
    1.
    Var="/etc/httpd/conf/httpd.conf"
    dirname $Var 
    etc/httpd/conf 
    
    basename $Var
    httpd.conf 
    
    2.
    Var=hsdzwmoon
    expr substr $Var 4 6   #编号从1开始
    zwmoon
    
    3.
    Var=hsdzwmoon
    echo ${Var:4:6}   #编号从0开始
    wmoon
    
    echo ${var::5} #从开头开始截取 可以省略起始位置的书写
    hsdzw      

    2.字符串替换
    使用${}表达式
      格式1:${var/old/new}   #将变量里第一个old替换成new

      格式2:${var//old/new}   #将变量里所有old替换成new


    例子:
    1.
    Var=hsdzwmoon
    echo ${Var/o/l}   
    hsdzwmlon
    
    echo ${var//o/l}
    hsdzwmlln

    3.使用随机字符串
    如何获取随机字符串?
    linux 里没有可以获取随机字符串的变量
    可以通过如下方式获得:
    /dev/urandom  #设备文件,随机字符  乱码的
       |
    /usr/bin/md5sum #校验和  生成ASCII码
       | 
    /bin/cut       #格式处理,截取我们需要保留的部分

    随机字符->ASCII 字符
    head -1  /dev/urandom |md5sum   #head -1 第一行随机字符
    使用cut切割字符串
    echo $var |cut -b  起始位置-结束位置  #位置为首、尾时可省略
    例子:
    1.
    如下图:



    六、条件测试

    1.测试操作规范:
    测试的本质:
      是一条操作命令,根据$?返回值来判断条件是否成立
    操作规范:
        格式1:test 条件表达式
    格式2:[条件表达式]
    测试操作的练习方法:
     直接跟&&echo YES 判断结果
      用法:[条件表达式] && echo YES


    例子:

    1.如下图:




    2.文件状态的检测:

    2.1 存在及识别:
      -e:目标是否存在
      -d:是否为目录
      -f:是否为文件
    例子:
    1.如下图:


    2.2 权限的检测:
    -r:是否有读取权限
    -w:是否有写入权限

    -x:是否有可执行权限

    例子:
    1.如下图:


    [ -x "/etc/shadow" ] && echo YES
    [ -r "/etc/shadow" ] && echo YES
    YES 

    特殊情况:
    root 用户下:
    ls -l  /etc/shadow
    -r-------- 1 root root 1386 04-16 18:58 /etc/shdow
    [ -w "/etc/shadow" ] && echo YES  #root下我们可以看到没有写权限,但是输出为YES,这里要注意:所有者W例外 
    YES                         
    

    3.整数值比较、子串匹配
    整数值比较:
      -eq:等于
      -ne:不等于
      -gt:大于
      -lt:小于
      -ge:大于或等于
      -le:小于或等于
      
    例子:
    who | wc -l #统计登陆用户数



    4.字符串匹配:
      =:两个字符串相同
     !=:两个字符串不相同
     
     例子:
     1.如下图:



    七、使用if判断结构

    程序流控制:
       执行过程的顺序化、自动化
       希望脚本智能化的选择与处理
       让重复操作更聪明一些
       对于...多个对象...如何逐个来处理? for
       在...取值是...的情况下怎么办?  case
       如果...条件是...时程序需要做什么? if

    1.单分支if语句结构
     

     

    if 条件测试 

         then 命令序列      #只关注条件成立的情况
      fi                 

    例子:


    单分支if应用示例:
    检查备份目录/opt/mrepo,若不存在则创建
    cat chkdir.sh 
    #!/bin/bash
    BACKUP_DIR="/opt/mrepo"
    if [ ! -d $BACKUP_DIR ]
    then 
      mkdir -p $BACKUP_DIR
    fi


    2.双分支if语句结构


    if 条件测试

       then  命令序列1
       else 命令序列2
    fi 

    例子: 

    双分支if应用示例:
      判断目标主机是否存活,显示检测结果 
    cat chkhost.sh
    
    #!/bin/bash 
    ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
    if[ $? -eq 0 ]
    then 
      echo "Host $1 is up."
    else
      echo ”Host $1 is down“
    fi
    
    
    ./chkhost.sh   192.168.4.11
    Host  192.168.4.11  is up
    
    
    ./chkhost.sh  192.168.4.13
    Host 192.168.4.13 is down

    3.多分支if语句结构
      if 条件测试1
        then 命令序列1
      elif 条件测试2 
        then 命令序列2  
      else
        命令序列n
      fi
      
     例子:
    多分支if应用示例:
       判断机试分数,区分优秀/合格/不合格
      
    cat gradediv.sh
    #!/bin/bash
    read -p "请输入你的分数(0-100):" GRADE
    if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ];then
       echo "$GRADE 分!优秀"
    elif [ $GRADE -ge 70 ]&&[ $GRADE -le 84 ];then
       echo "$GRADE分,合格"
    else
       echo "$GRADE 分?不合格"
    fi


    结果如下图:



    八、使用for循环

    for 变量名 in 取值列表
    do 
       命令序列
    done

    for IP地址 in 主机地址列表
    do
      检查状态
    done

    例子:


    1.依次输出 1st. 2nd. 3rd.
    #!/bin/bash
    
    
    for i in "1st." "2nd." "3rd."
    do
      echo $i
    done

    结果如下图:


    2.逐词输出/etc/host.conf 文件内容


    #!/bin/bash
    for i in $(cat /etc/host.conf)
    do 
      echo $i
    done 


    结果如下图:



    实战案例:
    1.目标:批量加用户账号:
      用户列表文件users.txt ,每行一个
      将初始口令设为123456,首次登陆后必须更改

    cat uad.sh 
    #!/bin/bash
    for i in $(cat /root/users.txt)
    do
       useradd $i
       echo "123456" | passwd --stdin $i 
       chage -d 0 $i 
    done 

    结果如下图:


       
    2.检测一个IP范围的主机状态:
       192.168.4.1 -192.168.10
       根据是否ping通来判断
     
    cat chkping.sh
    #!/bin/bash
    IP_PRE="192.168.4."
    for IP in $(seq 1 5)
    do 
    ping -c 3 -i 0.2 -W 3 ${IP_PRE}$IP &>/dev/null
    if[ $? -eq 0 ];then  
      echo "${IP_PRE}$IP is up."
    else
      echo ”${IP_PRE}$IP is down“
     fi
    done
    
    
    ./chkping.sh
    192.168.4.1 is down
    192.168.4.2 is up 
    192.168.4.3 is down 
    192.168.4.4 is down 
    ......
    

  • 相关阅读:
    模块
    关于使用 jBox 对话框的提交问题
    Julia is a high-level, high-performance dynamic programming language for technical computing, with syntax that is familiar to users of other technical
    Julia语言:让高性能科学计算人人可用
    [ASP.NET Web API]如何Host定义在独立程序集中的Controller
    ASHX呼叫ASPX.cs的方法
    robotlegs2.0框架实例源码带注释
    指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名(转)
    老板该如何正确的犒赏程序员(转)
    Jass 技能模型定义(转)
  • 原文地址:https://www.cnblogs.com/bigdata1024/p/8387452.html
Copyright © 2011-2022 走看看