zoukankan      html  css  js  c++  java
  • shell脚本进阶

    1.bash条件判断

    1.1 条件测试类型

    整数测试
    字符测试
    文件测试

    1.2 条件测试的表达式

    [ expression ]
    [[ expression ]]
    test expression
    

    1.3 整数测试

    -eq     //测试两个整数是否相等
    -ne     //测试两个整数是否不等
    -gt     //测试一个数是否大于另一个数
    -lt     //测试一个数是否小于另一个数
    -ge     //大于或等于
    -le     //小于或等于
    

    1.4 字符测试

    ==      //等值比较,检查==两边的内容是否一致,==两边都要有空格
    !=      //检查两边内容是否不一致,不一致为真,一致为假
    =~      //左侧字符串是否能够被右侧的PATTERN所匹配到。此表达式应用于双中括号[[]]中
    -z "string"     //测试指定字符串是否为空,空则为真,不空则为假
    -n "string"     //测试指定字符串是否不空,不空则为真,空则为假
    

    1.5 文件测试

    //存在性测试:
        -e      //测试文件是否存在
    //存在性及类别测试:
        -b      //测试文件是否为块设备文件
        -c      //测试文件是否为字符设备文件
        -f      //测试文件是否为普通文件
        -d      //测试指定路径是否为目录
        -h      //测试文件是否为符号链接文件
        -L      //测试文件是否为符号链接文件
        -p      //测试文件是否为命名管道文件
        -S      //测试文件是否为套接字文件
    //文件权限测试:
        -r      //测试当前用户对指定文件是否有读权限
        -w      //测试当前用户对指定文件是否有写权限
        -x      //测试当前用户对指定文件是否有执行权限
    //文件特殊权限测试:
        -g      //测试文件是否有sgid权限
        -u      //测试文件是否有suid权限
        -k      //测试文件是否有sticky权限
    //文件大小测试:
        -s      //测试文件是否非空
    //文件是否打开测试:
        -t fd   //fd表示的文件描述符是否已经打开且与某终端相关
    //双目测试:
        file1 -ef file2     //测试file1与file2是否指向同一个设备上的相同inode,说白点就是两者是不是同一个文件
        file1 -nt file2     //测试file1是否比file2新
        file1 -ot file2     //测试file1是否比file2旧
    //无分类:
        -N      //测试文件自从上一次被读取之后是否被修改过
        -O      //测试文件是否存在并且被当前用户拥有
        -G      //测试文件是否存在并且默认组是否为当前用户组
    

    1.6 组合测试条件

    -a      //与关系
    -o      //或关系
    !       //非关系
    
    [ $# -gt 1 -a $# -le 3 ]
    [ $# -gt 1 ] && [ $# -le 3 ]
    

    1.7 条件判断,控制结构

    1.7.1 单分支if语句

    if 判断条件; then
        statement1
        statement2
        ......
    fi
    

    1.7.2 双分支if语句

    if 判断条件; then
        statement1
        statement2
        ......
    else
        statement3
        statement4
        ......
    fi
    

    1.7.3 多分支if语句

    if 判断条件1; then
        statement1
        statement2
        ......
    elif 判断条件2; then
        statement3
        statement4
        ......
    else
        statement5
        statement6
        ......
    fi
    

    2. 分支选择

    2.1case语句

    case $变量名 in            
    value1)                
        statement                
        ...                
        ;;            
    value2)                
        statement                
        ...                
        ;;            
    *)                
        statement                
        ...                
        ;;        
    esac
    
    //case支持glob风格的通配符:
        *           //任意长度任意字符
        ?           //任意单个字符
        []          //指字范围内的任意单个字符
        abc|bcd     //abc或bcd
    

    3. 循环语句

    循环语句通常需要有一个进入条件和一个退出条件。

    3.1 for循环

    for循环当列表不为空时进入循环,否则退出循环

    for 变量 in 列表; do
        循环体
    done
    
    for ((expr1;expr2;expr3))
    {
        循环体
    }
    
    for (( expr1 ; expr2 ; expr3 ));do
        循环体
    done
    
    expr1   //用于指定初始条件,给控制变量一个初始值
    expr2   //判定什么时候退出循环
    expr3   //修正expr1指定的变量的值
    
    //如何生成列表:
        {1..100}
        seq [起始数] [步进长度] 结束数
    

    3.2 while循环

    while循环适用于循环次数未知的场景,注意要有退出条件。
    条件满足时进入循环,条件不满足了退出循环。

    3.2.1 while循环正常用法

    while 条件; do
        statement
        ...
    done
    

    3.2.2 while循环特殊用法

    //while循环特殊用法一:死循环
    while :;do
        statement
        ...
    done
    
    //这里的冒号可以改成任何非空值
    
    while循环特殊用法二:逐行读取某文件,将值存入line变量中
    while read line;do
        statement
        ...
    done < /path/to/somefile
    

    3.3 until循环

    条件不满足时进入循环,条件满足了退出循环。
    
    until 条件; do
        statement
        ...
    done
    

    3.4 循环语句特殊情况

    在循环语句中,有几种特别情况:

    • break [num]:提前退出循环。当循环语句中出现break时,将提前退出循环,不再执行循环后面的语句
    • continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环

    4. 定义脚本退出状态码

    //exit命令用于定义执行状态结果
    
    exit #      //此处的#号是一个数字,其范围可以是0-255
    
    如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码
    
    注意:脚本中一旦遇到exit命令,脚本会立即终止
    

    5.实例

    5.1一直ping和tcpping某个文件中的ip,不通则发告警邮件

    #!/bin/bash
    # ping and tcpping ip or domain name in file
    ip_file=$1
    while :;do
        for i in $(cat $ip_file);do
            ping -c 3 $i >/dev/null
            status1=$(echo $?)
            status2=$(tcpping $i -p 53 -c 1 |tr '
    ' ';'|awk '{if($1=="OK")print "0" ;else print "1" }') 2>/dev/null
                if [ "$status1" -ne 0 ] || [ "$status2" -ne 0 ];then
                    date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
                    if [ "$status1" -ne 0 ] && [ "$status2" -ne 0 ];then
                            echo "$i Server Ping and Tcpping Port 53 is down ${date}"|mail -s "Server $i" 1576014300@qq.com
                            echo "$i:status1:$status1 - $i:status2:$status2"
                    elif [ "$status1" -ne 0 ];then
                            echo "$i Server Ping is down ${date}"|mail -s "Server $i" 1576014300@qq.com
                            echo "$i:status1:$status1"
                    else
                            echo "$i Server Tcpping Port 53 is down ${date}"|mail -s "Server $i" 1576014300@qq.com
                            echo "$i:status2:$status2"
                    fi
                fi
                sleep 60
        done
    done
    

    5.299乘法表

    #!/bin/bash
    # multiplication table
    
    for i in $(seq 9);do
        for j in $(seq $i);do
            echo -en "${j}x${i}=$[$i * $j]	"
        done
        echo
    done
    
    [root@localhost ~]# ./99.sh 
    1x1=1	
    1x2=2	2x2=4	
    1x3=3	2x3=6	3x3=9	
    1x4=4	2x4=8	3x4=12	4x4=16	
    1x5=5	2x5=10	3x5=15	4x5=20	5x5=25	
    1x6=6	2x6=12	3x6=18	4x6=24	5x6=30	6x6=36	
    1x7=7	2x7=14	3x7=21	4x7=28	5x7=35	6x7=42	7x7=49	
    1x8=8	2x8=16	3x8=24	4x8=32	5x8=40	6x8=48	7x8=56	8x8=64	
    1x9=9	2x9=18	3x9=27	4x9=36	5x9=45	6x9=54	7x9=63	8x9=72	9x9=81	
    

    5.3编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机

    #!/bin/bash
    
    for i in {1..254};do
        ping -c 3 -i 0.3 -w 1 192.168.1.$i &>/dev/null
    #每隔0.3秒ping一次,一共ping2次,并以1毫秒为单位设置ping的超时时间
        if [ $? eq 0 ];then
            echo "192.168.1.$1 is up"
        else
            echo "192.168.1.$i is down"
        fi
    done
    
  • 相关阅读:
    CentOS7配置Tomcat8开机自动启动
    StackExchange.Redis 异步超时解决方案
    同一个tomcat部署多个项目导致启动失败
    吐血记录微信小程序授权获取Unionid及linux下使用bouncycastle解密用户数据 遇到的坑
    CentOS7设置ssh服务以及端口修改
    linux CentOS7安装与配置nginx1.18.0 并设置开机启动
    C语言函数指针用法
    Javascript优点和缺点
    VIM 单词大小写转换
    python base64编码实现
  • 原文地址:https://www.cnblogs.com/liping0826/p/13254708.html
Copyright © 2011-2022 走看看