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 fori 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