使用if選擇結構
學習目標
1.檢測/media/cdrom目錄,若不存在則創建
2.檢測并判斷指定的主機是否可ping通
3.從鍵盤讀取一個論壇積分,判斷論壇用戶等級,等級分類如下:
大于等于90 神功絕世
大于等于80,小于90 登峰造極
大于等于70,小于80 爐火純青
大于等于60,小于70 略有小成
小于60 初學乍練
方案
if單分支的語法組成:
if 條件測驗
then
命令序列
fi
if雙分支的語法組成:
if 條件測驗
then
命令序列1
else
命令序列2
fi
if多分支的語法組成:
if 條件測驗1 ;then
命令序列1
elif 條件測驗2 ;then
命令序列2
else
命令序列n
fi
步驟
實作此案例需要按照如下步驟進行,
步驟一:檢測/media/cdrom目錄,若不存在則創建
1)撰寫腳本如下:
[root@svr5 ~]# vim mountdir.sh
#!/bin/bash
dir="/media/cdrom/"
if [ ! -d $dir ]
then
mkdir -p $dir
fi
[root@svr5 ~]# chmod +x mountdir.sh // 添加可執行權限
2)測驗、驗證腳本功能
[root@svr5 ~]# ls -ld /media/cdrom //本 來沒有/media/cdrom目錄
ls: /media/cdrom: 沒有那個檔案或目錄
[root@svr5 ~]# ./mountdir.sh //執行腳本
[root@svr5 ~]# ls -ld /media/cdrom //再檢查已經有了
drwxr-xr-x 2 root root 4096 12-11 15:16 /media/cdrom
有了/media/cdrom檔案夾以后,再次執行上述腳本,實際上不做任何有效操作:
[root@svr5 ~]# ./mountdir.sh
步驟二:檢測并判斷指定的主機是否可ping通
1)分析任務需求
使用ping命令檢測目標主機時,人工可直接判斷反饋結果,而腳本卻不方便,但是當ping測驗成功時,執行狀態 ? 的 值 為 0 ; 而 p i n g 測 試 失 敗 時 , ?的值為0;而ping測驗失敗時, ?的值為0;而ping測試失敗時,?的值不為0,因此在Shell腳本中可以利用這一點來判斷ping目標主機的成敗,
為了節省ping測驗時間,可以只發送3個測驗包(-c 3)、縮短發送測驗包的間隔秒數(-i 0.2)、等待反饋的超時秒數(-W 1),比如,檢查可ping通的主機:
[root@svr5 ~]# ping -c 3 -i 0.2 -W 1 192.168.4.5
PING 192.168.4.5 (192.168.4.5) 56(84) bytes of data.
64 bytes from 192.168.4.5: icmp_seq=1 ttl=64 time=0.131 ms
64 bytes from 192.168.4.5: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 192.168.4.5: icmp_seq=3 ttl=64 time=0.073 ms
--- 192.168.4.5 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 402ms
rtt min/avg/max/mdev = 0.073/0.093/0.131/0.027 ms
[root@svr5 ~]# echo $? //執行狀態表示成功
0
2)腳本撰寫參考如下:
[root@svr5 ~]# vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 1 $1 &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $1 is up."
else
echo "Host $1 is down."
fi
[root@svr5 ~]# chmod +x pinghost.sh
3)測驗、驗證腳本功能
[root@svr5 ~]# ./pinghost.sh 192.168.4.5
Host 192.168.4.5 is up.
[root@svr5 ~]# ./pinghost.sh 192.168.4.50
Host 192.168.4.50 is down.
步驟三:從鍵盤讀取一個論壇積分,判斷論壇用戶等級
1)腳本撰寫參考如下:
大于等于90 神功絕世
大于等于80,小于90 登峰造極
大于等于70,小于80 爐火純青
大于等于60,小于70 略有小成
小于60 初學乍練
[root@svr5 ~]# vim grade.sh
#!/bin/bash
read -p "請輸入積分(0-100):" JF
if [ $JF -ge 90 ] ; then
echo "$JF 分,神功絕世"
elif [ $JF -ge 80 ] ; then
echo "$JF 分,登峰造極"
elif [ $JF -ge 70 ] ; then
echo "$JF 分,爐火純青"
elif [ $JF -ge 60 ] ; then
echo "$JF 分,略有小成"
else
echo "$JF 分,初學乍練"
fi
[root@svr5 ~]# chmod +x grade.sh
3)測驗、驗證腳本
[root@svr5 ~]# ./grade.sh
請輸入分數(0-100):74
74 分,爐火純青
[root@svr5 ~]# ./grade.sh
請輸入分數(0-100):68
68 分,略有小成
[root@svr5 ~]# ./grade.sh
請輸入分數(0-100):87
87 分,登峰造極
使用for回圈結構
學習目標
撰寫一個Shell腳本chkhosts.sh,利用for回圈來檢測多個主機的存活狀態,相關要求及說明如下:
對192.168.4.0/24網段執行ping檢測
腳本能遍歷ping各主機,并反饋存活狀態
執行檢測腳本以后,反饋結果如圖-1所示,

方案
在Shell腳本應用中,常見的for回圈采用遍歷式、串列式的執行流程,通過指定變數從值串列中回圈賦值,每次復制后執行固定的一組操作,
for回圈的語法結構如下所示:
for 變數名 in 值串列
do
命令序列
done
for 變數名 in {1..5}
do
命令序列
done
for 變數名 in `seq 5`
do
命令序列
done
for 變數名 in `ls /etc/*.conf`
do
命令序列
done
步驟
步驟一:練習for回圈基本用法
腳本1,通過回圈批量顯示5個hello world:
[root@svr5 ~]# vim for01.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo "hello world"
done
[root@svr5 ~]# chmod +x for01.sh
[root@svr5 ~]# ./for01.sh
腳本2,通過回圈批量顯示10個hello world:
[root@svr5 ~]# vim for02.sh
#!/bin/bash
for i in {1..10}
do
echo "hello world"
done
[root@svr5 ~]# chmod +x for02.sh
[root@svr5 ~]# ./for02.sh
腳本3,通過回圈批量顯示10個數字:
[root@svr5 ~]# vim for03.sh
#!/bin/bash
for i in {1..10}
do
echo "$i"
done
[root@svr5 ~]# chmod +x for03.sh
[root@svr5 ~]# ./for03.sh
步驟二:批量檢測多個主機的存活狀態
1)撰寫腳本如下:
命令備注:ping命令可以測驗某臺主機的連通性,
使用-c選項可以設定ping的次數,
使用-i選項可以設定多次ping之間的間隔時間(單位秒),
使用-W選項可以設定ping不通時的超時時間(單位秒),
[root@svr5 ~]# vim chkhosts.sh
#!/bin/bash
for i in {1..254}
do
ping -c 3 -i 0.2 -W 1 192.168.4.$i &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host 192.168.4.$i is up."
else
echo "Host 192.168.4.$i is down."
fi
done
[root@svr5 ~]# chmod +x chkhosts.sh
4)測驗、驗證腳本
… …
[root@svr5 ~]# ./chkhosts.sh
Host 192.168.4.5 is up.
Host 192.168.4.6 is down
… …
步驟三:創建賬戶的案例
創建users.txt,寫入無規律的賬戶名稱,最后使用for回圈讀取該檔案,批量創建賬戶并設定密碼,
[root@svr5 ~]# vim addfor.sh
#!/bin/bash
for i in `cat /root/user.txt`
do
useradd $i
echo 123456 | passwd --stdin $i
done
附加擴展知識(C語言風格的for回圈語法格式)
[root@svr5 ~]# vim cfor.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
echo $i
done
使用while回圈結構
學習目標
使用while回圈的腳本程式,分別實作以下目標:
提示用戶猜測一個亂數,直到才對為止
檢測192.168.4.0/24網段,列出不在線的主機地址
方案
while回圈屬于條件式的執行流程,會反復判斷指定的測驗條件,只要條件成立即執行固定的一組操作,直到條件變化為不成立為止,所以while回圈的條件一般通過變數來進行控制,在回圈體內對變數值做相應改變,以便在適當的時候退出,避免陷入死回圈,
while回圈的語法結構如下所示:
while 條件測驗
do
命令序列
done
while :
do
命令序列
done
步驟
步驟一:練習while回圈基本用法
腳本1,無心的死回圈腳本:
[root@svr5 ~]# vim while01.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo "$i"
done
[root@svr5 ~]# chmod +x while01.sh
[root@svr5 ~]# ./while01.sh //死回圈,需要使用Ctrl+C終止腳本
腳本2,有效回圈腳本:
[root@svr5 ~]# vim while02.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo "$i"
let i++
done
[root@svr5 ~]# chmod +x while02.sh
[root@svr5 ~]# ./while02.sh
腳本3,死回圈的一般格式:
[root@svr5 ~]# vim while03.sh
#!/bin/bash
while :
do
echo "hello world"
done
[root@svr5 ~]# chmod +x while03.sh
[root@svr5 ~]# ./while03.sh //死回圈,需要使用Ctrl+C終止腳本
步驟二:提示用戶猜測一個亂數,直到才對為止
使用系統自帶變數RANDOM提取亂數(1-100),使用while :制作死回圈,
腳本撰寫參考如下:
[root@svr5 ~]# vim guess.sh
#!/bin/bash
num=$[RANDOM%100+1]
i=0
while :
do
read -p "亂數1-100,你猜:" guess
let i++ //猜一次,計數器加1,統計猜的次數
if [ $guess -eq $num ];then
echo "恭喜,猜對了"
echo "你猜了$i次"
exit
elif [ $guess -gt $num ];then
echo "猜大了"
else
echo "猜小了"
fi
[root@svr5 ~]# chmod +x guess.sh
執行腳本并驗證結果:
[root@svr5 ~]# ./guess.sh
步驟三:檢測192.168.4.0/24網段,列出不在線的主機地址
1)任務需求及思路分析
要求的是“檢測192.168.4.0/24網段,列出不在線的主機地址”,
檢測目標是一個網段,其網路部分“192.168.4.”可以作為固定的前綴;而主機部分包括從1~254連續的地址,所以可結合while回圈和自增變數進行控制,
2)根據實作思路撰寫腳本
[root@svr5 ~]# vim chknet.sh
#!/bin/bash
i=1
while [ $i -le 254 ]
do
IP="192.168.4.$i"
ping -c 3 -i 0.2 -W 1 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is up."
else
echo "Host $IP is down."
fi
let i++
done
[root@svr5 ~]# chmod +x chknet.sh
3)測驗、驗證腳本
[root@svr5 ~]# ./chknet.sh
Host 192.168.4.1 is down.
Host 192.168.4.2 is down.
Host 192.168.4.3 is down.
Host 192.168.4.4 is down.
Host 192.168.4.5 is up.
.. ..
Host 192.168.4.250 is down.
Host 192.168.4.251 is down.
Host 192.168.4.252 is down.
Host 192.168.4.253 is down.
Host 192.168.4.254 is down
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/211728.html
標籤:其他
