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