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

 

posted @ 2018-09-26 14:00  少校的小木屋  阅读(676)  评论(0编辑  收藏  举报