shell腳本——日常練手


1、猜數小游戲

關鍵點:命令寫法

1、$RANDOM 的使用格式

2、反引號 用於執行命令

3、let 整數自加1的用法

4、引用局部變量,${ }格式

5、elif 后面也要跟 ;then

#!/bin/bash
#*************猜數游戲*************

i=0             #記錄猜數次數
num2=`echo $RANDOM | cut -c 1-2`        #目標數指定隨機值

while true      #死循環
do
    read -p "請輸入兩位整數:" num1     #輸入競猜初始值
    if [ ${num1} -gt ${num2} ];then     #如果猜的比目標數大
        echo "比 ${num1} 小"    #提示輸入值偏大
        let i++                 #猜錯次數加1    
    elif [ ${num1} -lt ${num2} ];then   #如果猜的比目標數小     
        echo "比 ${num1} 大"    #提示輸入值偏小
        let i++                 #猜錯次數加1
    else
        echo "猜對了:就是 ${num2} "    #輸出猜對的結果
        echo "一共猜錯了 ${i} 次 "      #輸出猜錯次數
        break                   #跳出循環
    fi
done

 

2、局域網檢查上線ip並保存在線ip

關鍵點:美觀度調整方法

1、調用內部文件方法 .[空格]  

2、echo -n 不空行輸出

3、"黑洞文件" /dev/null 該目錄存放條件判斷結果,不會呈現給用戶,使輸出簡潔

4、使用 nohup bash ping_ip.sh &  屏蔽ping的過程 ("&"指在后台運行  "nohup"指關閉終端仍繼續運行)

  可使用 ps aux | grep "ping_ip.sh"  過濾出來后,使用kill -9 終止

#!/bin/bash
#*********************檢測同網段中ip**********************

. /etc/init.d/functions         #調用內部文件
ip=192.168.9.                   #指定網段
for i in `seq 1 255`            #截取從1~255的ip
do
    if ping -c 1 -w 1 ${ip}${i} &>/dev/null ;then       #ping ip反饋信息寫入黑洞文件
        echo -n "${ip}${i}"             #打印ip
        success         #使用functions函數,美觀展示
        echo ""
        echo "${ip}${i}">>/root/bash/ping_ip.txt        #將在線ip輸出至文檔
        #echo "${ip}${i} 在線"
    else
        echo -n "${ip}${i}"             #打印ip
        failure         #使用functions函數,美觀展示
        echo ""
        #echo "${ip}${i} 不在線"
    fi
done

 

 

 3、打印九九乘法表

關鍵點:嵌套

1、注意嵌套縮進

#!/bin/bash
#**********************九九乘法表*****************
for i in `seq 1 9`      #取數字1~9
do
    for j in `seq ${i} 9`       #取數字從i~9
    do
        echo -n " ${i} * ${j} = $((i*j))  " #相乘不換行
    done
    echo -e "\n"        #第一個因數改變后換行
done

 

 

 

 4、批量創建用戶並設置8位加密密碼,可登陸

關鍵點:

1、加密方法——key=`echo $RANDOM | md5sum | cut -c 1-8`

2、賬號密碼匹配——echo "${key} | passwd --stdin user${i}"

#!/bin/bash
#********************批量創建用戶並設置隨機登錄密碼*******************
for i in `seq 1 100`    #取數1~100
do
    useradd user${i}    #批量建立用戶user1~user100
    key=`echo $RANDOM|md5sum|cut -c 1-8`        #制作加密密碼
    echo ${key}|passwd --stdin user${i}         #賬號密碼匹配
    echo -e "賬號:user${i} \n密碼:${key}" >> /root/bash/passwd_100.txt        #將生成的賬戶密碼寫入文件保存
done

5、重啟服務

關鍵點:

1、shell變量 $? 可以反饋上一步命令執行狀況

#!/bin/bash
systemctl restart network       #重啟網卡
if [ "$?" == 0 ];then   #判斷前一步是否執行成功
    echo "成功重啟"
else
    echo "失敗"
fi

 

6、一鍵部署NFS客戶端、服務器端

關鍵點:

1、服務器端和客戶端各編輯一個shell腳本,兩個腳本的運行通過ssh免密遠程登錄實現

  • 服務器端腳本
#!/bin/bash
read -p "請輸入客戶端ip地址:" ip       #共享至客戶端ip
read -p "請輸入服務端共享文件絕對路徑:" dir1   #共享的文件
yum install nfs-utils rpcbind -y        #下載nfs服務及其依賴rpcbind
if [ -e "$dir1" ];then  #判斷共享文件是否存在
    chown -R nfsnobody: $dir1   #如果存在,更改屬主為nfsnobody
else
    mkdir $dir1 #如果不存在,創建一個共享目錄
    chown -R nfsnobody: $dir1   #更改屬主為nfsnobody
fi

echo "$dir1 $ip/24(rw)">>/etc/exports   #編輯配置文件
systemctl restart nfs rpcbind   #重啟服務端nfs和依賴rpcbind
if [ $? == 0 ];then     #檢測服務端nfs服務是否部署成功
    echo "服務器端nfs部署成功"
    ssh-keygen  #生成登錄密鑰
    echo "******請輸入${ip}的密碼*********"
    ssh-copy-id $ip     #傳輸公鑰
    if [ $? == 0 ];then #檢測公鑰是否傳輸成功
        echo "免密登錄成功"
        ssh $ip #登錄客戶端
    else
        echo "客戶端登錄失敗"
    fi
else
    echo "服務器端nfs部署失敗"
fi
  • 客戶端腳本
#!/bin/bash
read -p "請輸入服務端的ip地址:" ip     
read -p "請輸入服務端共享文件絕對路徑:" dir1   
read -p "請輸入客戶端共享文件掛載的絕對路徑:" dir2
yum install nfs-utils -y        #下載客戶端nfs服務
showmount -e $ip        #查看共享文件
if [ $? == 0 ];then     #nfs服務是否下載成功
    if [ -e "$dir2" ];then      #如果掛載點存在,直接掛載並查看
        mount -t nfs $ip:$dir1 $dir2
        df -h
    else        #如果掛載點不存在,創建掛載點並掛載查看
        mkdir $dir2     
        mount -t nfs $ip:$dir1 $dir2
        df -h
    fi
    echo "客戶端掛載成功"
else
    echo "服務端共享文件接收失敗"
fi

[root@localhost bash]# bash nfs.sh
請輸入客戶端ip地址:192.168.160.130
請輸入服務端共享文件絕對路徑:/root/nfs
已加載插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
軟件包 1:nfs-utils-1.3.0-0.61.el7.x86_64 已安裝並且是最新版本
軟件包 rpcbind-0.2.0-47.el7.x86_64 已安裝並且是最新版本
無須任何處理
服務器端nfs部署成功
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)?
******請輸入192.168.160.130的密碼*********
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.

免密登錄成功
Last login: Sun Jun 2 03:56:38 2019 from 192.168.160.99

[root@localhost ~]# ls
anaconda-ks.cfg bash lv_sgy
[root@localhost ~]# cd bash/
[root@localhost bash]# bash nfs.sh
請輸入服務端的ip地址:192.168.160.99
請輸入服務端共享文件絕對路徑:/root/nfs
請輸入客戶端共享文件掛載的絕對路徑:/root/nfs_server
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
軟件包 1:nfs-utils-1.3.0-0.61.el7.x86_64 已安裝並且是最新版本
無須任何處理
Export list for 192.168.160.99:
/root/nfs 192.168.160.130/24
文件系統 容量 已用 可用 已用% 掛載點
/dev/mapper/cl-root 17G 1.3G 16G 8% /
devtmpfs 478M 0 478M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 13M 476M 3% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 139M 876M 14% /boot
/dev/sr0 4.1G 4.1G 0 100% /mnt
tmpfs 98M 0 98M 0% /run/user/0
192.168.160.99:/root/nfs 17G 4.9G 13G 29% /root/nfs_server
客戶端掛載成功
[root@localhost bash]#

[root@localhost bash]# cd
[root@localhost ~]# ls
anaconda-ks.cfg bash lv_sgy nfs_server
[root@localhost ~]# touch ./nfs_server/a.txt
[root@localhost ~]# cd nfs_server/
[root@localhost nfs_server]# ls
a.txt
[root@localhost nfs_server]#

[root@localhost nfs_server]# exit
登出
Connection to 192.168.160.130 closed.
[root@localhost bash]# cd
[root@localhost ~]# ls
bash nfs 公共 模板 視頻 圖片 文檔 下載 音樂 桌面
[root@localhost ~]# ll nfs
總用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 6月 2 16:45 a.txt
[root@localhost ~]#

 

       

 7、統計以.sh結尾的文件總大小,以kb為單位

關鍵點:

1、在cut時會出現部分不顯示,但遍歷之后不會有影響

#!/bin/bash
sum=0
for i in `find /root -type f -a -name "*.sh"`
do
    size=`ls -l $i | cut -d " " -f 5`
    let sum+=size
done
echo "總大小為$(($sum/1024))kb"

 

8、查找含某個關鍵詞的文件

關鍵點:

1、grep -r 遞歸查詢

2、grep -l 返回目錄

[root@localhost bash]# find /usr/share/doc -type f |xargs grep -rl "sgy"
/usr/share/doc/libxslt-1.1.28/ChangeLog.gz
/usr/share/doc/libusal-1.1.11/Changelog
/usr/share/doc/opus-1.0.2/rfc6716.txt
grep: /usr/share/doc/python-setuptools-0.9.8/CHANGES: 沒有那個文件或目錄
grep: (links).txt: 沒有那個文件或目錄
/usr/share/doc/gcc-4.8.5/ChangeLog-2006.bz2
/usr/share/doc/yelp-3.14.2/NEWS
/usr/share/doc/gnome-packagekit-common-3.14.3/NEWS
/usr/share/doc/file-roller-3.14.2/NEWS
/usr/share/doc/gnome-software-3.14.7/NEWS
/usr/share/doc/gnome-system-monitor-3.14.1/NEWS
/usr/share/doc/wodim-1.1.11/Changelog
grep: /usr/share/doc/stix-fonts-1.1.0/STIX: 沒有那個文件或目錄
grep: Font: 沒有那個文件或目錄
grep: License: 沒有那個文件或目錄
grep: 2010.pdf: 沒有那個文件或目錄

#!/bin/bash
read -p "輸入想要查找的文件關鍵詞:" key
for i in `find /root -type f`
do
    if cat "$i" | grep "$key"  &>/dev/null;then
        echo "$i"
        sleep 1
    fi
done

 

9、大於100K的文件保存其他位置

關鍵點:

1、單位默認是K

#!/bin/bash
for i in `find /root -size +100 -a -type f`
do
    mv $i /tmp
done

 

10、參數相加

關鍵點:

1、$*的使用,表示所有參數($# 是統計參數個數)

#!/bin/bash
sum=0
for i in $*
do
    let sum+=i
done
echo "$sum"
~                

 

11、ip截取

#!/bin/bash
cat /etc/sysconfig/network-scripts/ifcfg-ens33 |grep "IP"| cut -d "=" -f 2

ip a|grep "ens33"|grep "inet"|tr -d " "|cut -d "/" -f 1|cut -d "t" -f 2

ip a | awk -F " " 'NR==9{print $2}' | awk -F "/" '{print $1}'

ip a |awk '$NF~/ens33/'|awk -F " " '{print $2}'|awk -F "/" '{print $1}'

ip a | sed -n '/ens33$/p'|awk -F " " '{print $2}'| awk -F "/" '{print $1}'

ip a | sed -n '/ens33$/p'|awk -F " +|/" '{print $3}'

ip a | sed -n '/ens33$/p'|awk 'BEGIN{FS=" +|/"}{print $3}'
[root@localhost bash]# bash ip_grep.sh 
192.168.160.99
192.168.160.99
192.168.160.99
192.168.160.99
192.168.160.99
192.168.160.99
192.168.160.99

 

12、域名統計

[root@ken ~]# cat ken.txt
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
... ...

[root@sgy bash]# cat ken.txt | awk -F "//" '{print $2}' | sort | uniq -c
34 www.baidu.com
14 www.qq.com
23 www.sina.com
19 www.taobao.com

[root@sgy bash]# cat ken.txt | awk 'BEGIN{FS="//"}{h[$2]++}END{ for (i in h) print h[i],i }'| sort -rn
34 www.baidu.com
23 www.sina.com
19 www.taobao.com
14 www.qq.com

 

13、簡易計算器

關鍵點:

1、可以將腳本中重復出現的代碼寫成函數,多次調用

#!/bin/bash
#********************************自制簡單計算器*****************************
#*******只適用於整數運算,浮點數與復數 不可計算*****************************

func() {
   echo "${num1}${sign}${num2}=$((${num1}${sign}${num2}))"
}

i=1
while [ "$i" != 0 ]
do
    read -p "請輸入一個整數:" num1     #輸入一個整數,可以是8進制、16進制
    read -p "請輸入運算符號(+、-、*、/、%、**):" sign  #輸入運算符,只可進行6種
    read -p "請輸入另一個整數:" num2   #輸入另一個整數,可以是8進制、16進制
    if [ -n "$num1" -a -n "$num2" -a -n "$sign" ];then  #判斷是否已輸入
        if [ "$sign" == "+" -o "$sign" == "-" -o "$sign" == "*" -o "$sign" == "**" ];then       #判斷+、-、*、**運算符號
            func
            #echo "${num1}${sign}${num2}=$((${num1}${sign}${num2}))"    #進行運算,返回值默為10進制
        elif [ "$sign" == "%" -o "$sign" == "/" -a "$num2" != 0 ];then  #判斷/、%運算符,並判斷除數是否為0      
            func
            #echo "${num1}${sign}${num2}=$((${num1}${sign}${num2}))"    #進行10進制運算
        else
            echo "該運算方式無法執行,請重新輸入~"      #提示並非上述6種運算方式
        fi
    fi
    read -p "是否繼續使用計算器?(輸入其他繼續,輸入0結束)" i   #是否退出循環
done

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM