天天看點

運維之shell篇-----3.循環結構 、 case語句 、 函數及中斷控制

THREE DAY

​​1.使用for循環結構​​ 

​​2.使用while循環結構​​ 

​​3.基于case分支編寫腳本​​ 

​​4.使用Shell函數​​ 

​​5.中斷及退出​​ 

for  變量名  in  值清單

Do

指令序列

Done

步驟一:練習for循環基本用法

腳本1,通過循環讀取賬戶檔案user.txt,批量建立賬戶:

[root@svr5 ~]# vim for01.sh
#!/bin/bash
for i in $(cat root/user.txt)
do
useradd $i
echo "123456" | passwd --stdin $i
done
[root@svr5 ~]# chmod +x for01.sh      

步驟二:批量檢測多個主機的存活狀态

1)編寫腳本如下:

[root@svr5 ~]# vim chkhosts.sh
#!/bin/bash
for IP in {1..254}
do
ping -c 3 -i 0.2 -W 3 192.168.4.$IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host 192.168.4.$IP is up."
else
echo "Host 192.168.4.$IP 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      

while  條件測試

Do

   指令序列

Done

步驟一:批量添加使用者賬号stu1-stu20

添加的賬号有固定的字首stu(練習中可自行設定),多個賬号從1開始編号,比如stu1、stu2、stu3、……、stu20。—— 編寫腳本uaddwhile.sh,實作批量添加這20個使用者賬号的功能,密碼均設為123456。

腳本編寫參考如下:

[root@svr5 ~]# vim uaddwhile.sh
#!/bin/bash
PREFIX="stu"                                      //定義使用者名字首
i=1
while [ $i -le 20 ]
do
useradd ${PREFIX}$i                              //添加的使用者名為:字首+編号
echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null
let i++
done
[root@svr5 ~]# chmod +x uaddwhile.sh      

執行腳本并驗證結果:

[root@svr5 ~]# ./uaddwhile.sh
[root@svr5 ~]# grep ^stu /etc/passwd              //檢查添加的使用者
stu1:x:531:531::/home/stu1:/bin/bash
stu2:x:532:532::/home/stu2:/bin/bash
stu3:x:533:533::/home/stu3:/bin/bash
stu4:x:534:534::/home/stu4:/bin/bash
stu5:x:535:535::/home/stu5:/bin/bash
… …      

步驟二:批量删除使用者賬号stu1-stu20

針對前面執行uaddwhile.sh腳本批量添加的使用者賬号,再建立一個批量删除這些賬号的腳本udelwhile.sh。結構類似,隻要替換為删除相關的操作即可。

腳本編寫參考如下:

[root@svr5 ~]# vim udelwhile.sh
#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ]
do
userdel -r ${PREFIX}$i &> /dev/null
let i++
done
[root@svr5 ~]# chmod +x udelwhile.sh      

執行腳本并驗證結果:

[root@svr5 ~]# ./udelwhile.sh
[root@svr5 ~]# grep ^stu /etc/passwd                  //再檢查已無相應賬号資訊
[root@svr5 ~]#      

步驟三:檢測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
NET="192.168.4."
i=1
while [ $i -le 254 ]
do
IP="${NET}$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.      

case  變量值  in

模式1)

指令序列1 ;;

模式2)

指令序列2 ;;

    .. ..

*)

步驟一:編寫腳本檔案

腳本編寫參考如下:

[root@svr5 ~]# vim test.sh
#!/bin/bash
case $1 in
redhat)
echo "fedora";;
fedora)
echo "redhat";;
*)                                              //預設輸出腳本用法
echo "用法: $0 {redhat|fedora}"
exit 1
esac

[root@svr5 ~]# chmod +x test.sh      

步驟三:驗證、測試腳本

未提供參數,或提供的參數無法識别時,提示正确用法:

[root@svr5 ~]# ./test.sh
用法: ./test.sh {redhat|fedora}      

确認可響應redhat控制參數:

[root@svr5 ~]# ./test.sh redhat
fedora      

确認可響應fedora控制參數:

[root@svr5 ~]# ./test.sh fedora
redhat      

 預設指令序列

Esac

function  函數名 {

指令序列

    .. ..

}

函數名() {

指令序列

    .. ..

}

1. [root@svr5 ~]# mycd(){                        //定義函數

2. > mkdir /test

3. > cd /test

4. > }

5. [root@svr5 ~]# mycd                            //調用函數

6. 

7. [root@svr5 ~]# mycd(){                        //定義函數

8. > mkdir $1

9. > cd $1

10. > }

11. [root@svr5 ~]# mycd  /abc                            //調用函數

12. [root@svr5 ~]# mycd  /360                            //調用函數

調用函數時,将使用者提供的兩個參數傳遞給函數處理。

2)根據實作思路編寫腳本檔案

[root@svr5 ~]# vim funexpr.sh
#!/bin/bash
myexpr() {
echo "$1 + $2 = $[$1+$2]"
echo "$1 - $2 = $[$1-$2]"
echo "$1 * $2 = $[$1*$2]"
echo "$1 / $2 = $[$1/$2]"
}
myexpr $1 $2

[root@svr5 ~]# chmod +x funexpr.sh      

break可以結束整個循環;continue結束本次循環,進入下一次循環;exit結束整個腳本,案例如下:

1. [root@svr5 ~]# cat  /root/test.sh

2. #!/bin/bash

3. for  i   in   {1..5}

4. do

5.         if  [  $i  -eq  3 ];then

6.              break            #這裡将break替換為continue,exit分别測試腳本執行效果

7.         fi

8.         echo $i