• shell脚本练习题->1


    猜随机数的大小

    描述:

    写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入:并且提示用户输入的数字比预设数字大或者小

    分析:

    1:随机数字是如何生成的

    2:这是一个死循环,直到猜对了才能退出

    3:需要判断大小

    脚本实现:

    [root@jumpserver-70 scripts]# cat num_random.sh 
    #!/bin/bash
    
    num=$(echo $(($RANDOM%100+1)))
    i=0
    
    while true
    do
        read -p "请猜一下这个数是多少:" number
        let i++
        if [[ ! $number =~ ^[0-9]+$ ]];then
            echo "请检查输入的是否为数字"
        elif [ $number -gt $num ];then
            echo "你输入的数大了!"
        elif [ $number -lt $num ];then
            echo "你输入的数小了- -"
        else
            echo "恭喜你!都会抢答了。"
            echo "你一共猜了 $i 次"
            exit 1
        fi
    done

    实现的效果:

    [root@jumpserver-70 scripts]# sh num_random.sh 
    请猜一下这个数是多少:10
    你输入的数小了- -
    请猜一下这个数是多少:50
    你输入的数小了- -
    请猜一下这个数是多少:90
    你输入的数大了!
    请猜一下这个数是多少:80
    你输入的数小了- -
    请猜一下这个数是多少:85
    你输入的数大了!
    请猜一下这个数是多少:83
    你输入的数小了- -
    请猜一下这个数是多少:84
    恭喜你!都会抢答了。
    你一共猜了 7 次
    

    文件中带随机数并修改

    描述:

    请写出:使用for循环在/opt目录下通过随机小写10个字母加固定字符串test批量创建10个html文件,创建完成后,讲test全部改为test_done(for循环实现),并html为大写HTML

    分析:

    1:随机是个小写字母 file=$(uuidgen | sed -r 's#[0-9-]+##g'|cut -c 1-10)

    2:创建的文件名字放到一个文件中,再取出文件名

    3:用mv改名用替换方式

    脚本实现:

    [root@jumpserver-70 scripts]# cat make_file.sh 
    #!/bin/bash
    
    for i in {1..10}
    do
        file=$(uuidgen | sed -r 's#[0-9-]+##g'|cut -c 1-10)
        [ -f test_$file.html ]    
        if [ $? -eq 0 ];then
            echo "这个文件已经存在。。"
        else
            touch /opt/test_${file}.html &>/dev/null
            echo  test_${file}.html >>/opt/test1.txt
            echo "你已经创建了 test_$file.html 文件"
        fi
    done
    
    echo "------------正在执行操作------------"
    
    for n in {1..10}
    do    
    name=$(sed -rn ${n}p /opt/test1.txt | sed -r 's#.*_(.*).html#1#g')
    name_new=test_done_${name}.HTML
            mv /opt/test_${name}.html /opt/$name_new 
            echo "文件 $name_new 修改成功"
    done     
    
    > /opt/test1.txt

    第二种方法:

    [root@web03 ~]# cat for_file2.sh 
    #!/bin/bash
    
    #1.循环创建10个随机文件名的html文件
    for i in {1..10}
    do
    File_Name=$(openssl rand -base64 40 |sed 's#[^a-z]##g'|cut -c1-10)
    touch test_${File_Name}.html
    done
    
    #2.查找当前目录下.html结尾的文件,写入一个文件中
    find ./ -type f -name "*.html" > 3.txt
    for i in $(cat 3.txt)
    do
    #4.将带html修改为HTML ${i/html/HTML} 将文件名后缀是html替换为HTML
    mv  $i ${i/html/HTML}
    done

    实现效果:

    [root@jumpserver-70 scripts]# sh make_file.sh 
    你已经创建了 test_fababba.html 文件
    你已经创建了 test_cdedacafaf.html 文件
    你已经创建了 test_eedbacbafc.html 文件
    你已经创建了 test_adbfdeb.html 文件
    你已经创建了 test_afdddcdebe.html 文件
    你已经创建了 test_bacfaeeacf.html 文件
    你已经创建了 test_bcfadfbcdd.html 文件
    你已经创建了 test_faeebfcdc.html 文件
    你已经创建了 test_eebecffac.html 文件
    你已经创建了 test_eefca.html 文件
    ------------正在执行操作------------
    文件 test_done_fababba.HTML 修改成功
    文件 test_done_cdedacafaf.HTML 修改成功
    文件 test_done_eedbacbafc.HTML 修改成功
    文件 test_done_adbfdeb.HTML 修改成功
    文件 test_done_afdddcdebe.HTML 修改成功
    文件 test_done_bacfaeeacf.HTML 修改成功
    文件 test_done_bcfadfbcdd.HTML 修改成功
    文件 test_done_faeebfcdc.HTML 修改成功
    文件 test_done_eebecffac.HTML 修改成功
    文件 test_done_eefca.HTML 修改成功
    [root@jumpserver-70 opt]# ll
    total 0
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test1.txt
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_aadacfbdea.HTML
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_badbcedabf.HTML
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_ccdbddfaff.HTML
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_daafffacfb.HTML
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_dbdecdabdc.HTML
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_dceafb.HTML
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_dcedbcbfa.HTML
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_eacfaabcff.HTML
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_ecbceabcbd.HTML
    -rw-r--r-- 1 root root 0 Sep 20 21:00 test_done_feceeecbdd.HTML

    查看访问日志访问最高的ip

    分析:

    awk方法取到access.log的第一列ip地址。然后使用sort uniq 进行排列

    命令实现:

     awk '{print $1}' access.log-20180929 | sort |uniq -c |sort -rn | head -1 

    把磁盘状态写进文件

    分析:

    1:磁盘状态查看  df -h

    2:   把状态写进文件 df -h >$(date +%F).log

    脚本实现:

    #!/bin/bash
    
    time = $(date + %F)
    df -h > $time.log

    查找文件->打包->还原

    分析:

    1:在/backup目录下创建.txt 文件 ,并筛选出来

    2:批量把txt为结尾的文件改为txt.bak

    3:   把所有的.bak文件打包压缩为123.tar.gz

    4: 批量还原文件的名字,及把增加的.back再删除

    脚本实现:

    [root@web03 ~]# cat file.sh 
    
    #1.修改名称
    find /backup/ -type f -name "*.txt" > /tmp/1.txt
    
    for i in $(cat /tmp/1.txt)
    do
    mv $i ${i}.bak
    done
    
    #2.重新查找,bak文件,然后进行打包
    cd /backup && tar czf 123.tar.gz $(find /backup/ -type f -name "*.bak")
    
    #3.将.bak还原.txt
    find /backup/ -type f -name "*.bak" >/tmp/2.txt
    
    for i in $(cat /tmp/2.txt)
    do
    mv $i ${i%.*}
    done

    实现效果:

    监控80端口是否开启

    描述:

    写一个脚本,判断本机的80端口(加入是httpd)是否开启,如果开启则什么都不用干,如果发现端口不存在,那么重启一下http服务,并发送邮件通知自己,脚本写好后每分钟执行一次,也可以写一个死循环

    分析:

    1:检测80端口是否正常  netstat -lntp |grep ":80"

    2:   如果不正常重启nginx

    3: 如果进程是启动的则重启,否则直接启动

    脚本实现:

    [root@web03 ~]# cat status.sh 
    #!/usr/bin/bash
    while true
    do
    #1.检查Nginx是否存或,让wc统计行数,方便整数比对
    Nginx_status=$(netstat -lntp|awk '{print $4}'|grep :80$|wc -l)
    
    #2.检查Nginx的值是1还是0,如果是0则代表没启动Nginx,如果是1则不做处理
    if [ $Nginx_status -eq 0 ];then
    echo  "正在尝试重启..."
    systemctl restart nginx &>/dev/null
    if [ $? -eq 0 ];then
    echo "重启成功..."
    else
    echo "重启失败"
    fi
    fi
    #3.判断结束后,休息5s
    sleep 5
    done

    网页出现502错误重启php

    描述:

    现在有一个lnmp环境, 经常出现502错误, 只要一重启php-fpm即可解决,如果不重启则会持续非常长的一段时间,所有有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启一下php-fpm

    分析:

    1.动态的监控日志尾部最后300行,统计502出现的总50次数
    2.精准判断是否是502错误,不是则不处理,是则重启php-fpm

    脚本实现:

    #1.准备对应的Nginx环境
    [root@web03 ~]# cat /etc/nginx/conf.d/discuz.conf 
    server {
            listen 80;
            root /code;
            index  index.html;
    server_name _;
    
    location / {
    proxy_pass http://127.0.0.1:8888;
    
    }
    location /test {
    root /code;
    index inde.html;
    }
    }
    
    2.编写对应的环境
    [root@web03 ~]# cat s.sh 
    #!/usr/bin/bash
    while true
    do
    
    #1.实时的抓取日志尾部的信息,筛选出502,进行统计
    LogFile=$(tail -n300 /var/log/nginx/access.log|grep 502|wc -l)
    
    #2.使用if进行判断
    if [ $LogFile -gt 50 ];then
    echo "正常重启php-fpm"
    pkill php-fpm && systemctl start php-fpm &>/dev/null
    if [ $? -eq 0 ];then
    echo "重启成功"
    else
    echo "重启失败"
    fi
    else
    echo "实时监控日志没有达到300行502"
    fi
    sleep 5
    done

    使用ab工具进行压力测试:

    故障的 url: ab -n 1000 -c 200 http://10.0.0.9/
    恢复的 url: ab -n 1000 -c 200 http://10.0.0.9/test/index.html

    取出给定单词的长度

    描述:

    用shell打印下面这句话中字母数小于6个的单词Bash also interprets a number of multi-user optios

    分析:

    1.使用循环遍历
    2.怎么统计单词数值 wc -c

    脚本实现:

    [root@web03 ~]# cat num.sh 
    #!/usr/bin/bash
    
    for i in Bash also interprets a number of multi-user optios
    do
    #1.传统获取变量的个数
    #re=$(echo -n $i|wc -c)
    
    #2.获取变量的个数
    re=$(echo ${#i})
    #3.进行数字比对
    if [ $re -lt 6 ];then
    echo $i
    fi
    done
  • 相关阅读:
    Embedding技术在商业搜索与推荐场景的实践
    Elasticsearch 性能调优:段合并(Segment merge)
    elasticsearch关于index性能优化
    nginx优化图片防盗链
    NextCloud搭建
    nginx优化限制连接请求limit_req
    Android 去除标题栏和状态栏的方法
    Struts2 集合属性接收问题探讨
    解决JAVA调用mysqldump备份数据库时文件为空的问题
    Hibernate自定义字段查询 注意事项
  • 原文地址:https://www.cnblogs.com/tim1blog/p/9706519.html
Copyright © 2020-2023  润新知