1. 程式人生 > >shell腳本練習題->1

shell腳本練習題->1

時間 ati 行操作 遍歷 mage 給定 .sh user 腳本練習

猜隨機數的大小

描述:

寫一個猜數字腳本,當用戶輸入的數字和預設數字(隨機生成一個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

shell腳本練習題->1