淺談Shell腳本中for循環、while循環及case分支語句

博文目錄
1、for循環語句
2、使用while循環語句
3、使用case分支語句mysql

1、for循環語句

當面對各類列表重複任務時,使用簡單的if語句已經難以知足要求,而順序編寫所有代碼更是顯得異常繁瑣,困難重重。這將可使用for循環語句很好的解決相似問題。sql

一、for語句的結構

使用for循環語句時,須要指定一個變量及可能的取值列表,針對每一個不一樣的取值重複執行相同的命令序列,直到變量值用完退出循環。在這裏,「取值列表」稱爲for語句的執行條件,其中包括多個屬性相同的對象,須要預先指定(如通信錄)。
for循環語句的語法結構以下所示:shell

for 變量名 in 取值列表
do
        命令序列
done

上述語句結構中,for語句的操做對象爲用戶指定名稱的變量,並經過in關鍵字爲該變量預先設置了一個取值列表,多個取值之間以空格進行分隔。位於do...done之間的命令序列稱爲循環體,其中的執行語句須要引用變量以完成相應的任務。vim

二、for語句的執行流程

首先將列表中的第一個取值賦給變量,並執行do...done循環體中的命令序列;而後將列表中的第二個取值賦給變量,並執行循環體中的命令序列......依此類推,直到列表中的全部取值用完,最後將
跳至done語句,表示結束循環,以下圖所示:centos

淺談Shell腳本中for循環、while循環及case分支語句

三、for語句應用示例

1)根據姓名列表批量添加用戶

根據公司人事部門給出的員工姓名的拼音列表,在Linux服務器中添加相應的用戶帳戶,初始密碼均設置爲「pwd@123」。其中,員工姓名列表中的帳號數量並不固定,並且除了要求帳號名稱是拼音以外,並沒有其餘特殊規律。
針對上述要求,可先指定員工列表文件user.txt,而後編寫一個名爲useradd.sh的shell腳本,從user.txt文件中讀取各用戶名稱,重複執行添加用戶,設置初始密碼的相關操做。bash

[root@centos01 ~]# vim user.txt   <!--用作測試的列表文件-->
zhangsan
lisi
wangwu
zhaoliu
[root@centos01 ~]# vim useradd.sh     <!--批量添加用戶的腳本-->
#!/bin/bash
user=$(cat /root/user.txt)
for username in $user
do
useradd $username
echo "pwd@123" | passwd --stdin $username &> /dev/null
done
[root@centos01 ~]# chmod +x useradd.sh     <!--添加執行權限-->
[root@centos01 ~]# ./useradd.sh  <!--運行批量建立用戶腳本-->
[root@centos01 ~]# tail -5 /etc/passwd      <!--確認執行結果-->
mysql:x:1001:1001::/home/mysql:/sbin/nologin
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
lisi:x:1003:1003::/home/lisi:/bin/bash
wangwu:x:1004:1004::/home/wangwu:/bin/bash
zhaoliu:x:1005:1005::/home/zhaoliu:/bin/bash

若要刪除useradd.sh腳本所添加的用戶,只須要參考上述腳本代碼,將for循環體中添加用戶的命令序列改成刪除用戶的操做便可。服務器

[root@centos01 ~]# vim deluser.sh    <!--批量刪除用戶的腳本-->
#!/bin/bash
user=$(cat /root/user.txt)
for username in $user
do
userdel -r $username
done
[root@centos01 ~]# chmod +x deluser.sh  <!--腳本文件添加執行權限-->
[root@centos01 ~]# ./deluser.sh     <!--運行批量刪除用戶腳本-->
[root@centos01 ~]# tail -5 /etc/passwd     <!--查看執行結果-->
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
test:x:1000:1000:test:/home/test:/bin/bash
mysql:x:1001:1001::/home/mysql:/sbin/nologin

2、使用while循環語句

for循環語句很是適用於列表對象無規律,且列表來源已固定(如某個列表文件)的場合。而對於要求控制循環次數、操做對象按數字順序編號、按特定條件執行重複操做等狀況,則更適合適用另外一種循環——while語句。ssh

一、whie語句的結構

適用while循環語句時,能夠根據特定的條件反覆執行一個命令序列,直到該條件再也不知足時爲止。在腳本應用中,應該避免出現死循環的狀況,不然後邊的命令操做將沒法執行。所以,循環體內的命令序列中應包括修改測試條件的語句,以便在適當的時候測試條件再也不成立,從而結束循環。
while循環語句的語法結構以下所示:tcp

while 條件測試操做
do
命令序列
done

二、while語句的執行流程

首先判斷while後的條件測試操做結果,若是條件成立,則執行do...done循環體中的命令序列;返回while後再次判斷條件測試結果,若是條件仍然成立,則繼續執行循環體,再次返回到while後,判斷條件測試結果.....如此循環,直到while後的條件測試結果再也不成立爲止,最後跳轉到done語句,表示結束循環。以下圖所示:ide

淺談Shell腳本中for循環、while循環及case分支語句

使用while循環語句時,有兩個特殊的條件測試操做,即true(真)和false(假)。使用true做爲條件時,表示條件永遠成立,循環體內的命令序列將無限執行下去,除非強制終止腳本(或經過exit語句退出腳本);反之,若使用false做爲條件,則循環體將不會被執行。這兩個特殊條件也能夠用在if語句的條件測試中。

三、while語句應用示例

1)批量添加規律編號的用戶

在一些技術培訓和學習領域,出於實驗或測試的目的,須要批量添加用戶帳號,這些用戶的名稱中包含固定的前綴字串,並按照數字順序依次進行編號,帳號的數量每每也是固定的。

[root@centos01 ~]# vim useraddress.sh  <!--批量添加用戶的腳本-->
[#!/bin/bash
prefix="user"
i=1
while [ $i -le 20 ]
do
useradd ${prefix}$i
        echo "pwd@123" | passwd --stdin ${prefix}$i &> /dev/null
let i++
done
[root@centos01 ~]# chmod +x useraddress.sh  <!--腳本添加執行權限-->
[root@centos01 ~]# ./useraddress.sh    <!--運行腳本-->
[root@centos01 ~]# grep "user" /etc/passwd | tail -20 <!--查看執行結果-->
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
user4:x:1005:1005::/home/user4:/bin/bash
user5:x:1006:1006::/home/user5:/bin/bash
user6:x:1007:1007::/home/user6:/bin/bash
user7:x:1008:1008::/home/user7:/bin/bash
user8:x:1009:1009::/home/user8:/bin/bash
user9:x:1010:1010::/home/user9:/bin/bash
user10:x:1011:1011::/home/user10:/bin/bash
user11:x:1012:1012::/home/user11:/bin/bash
user12:x:1013:1013::/home/user12:/bin/bash
user13:x:1014:1014::/home/user13:/bin/bash
user14:x:1015:1015::/home/user14:/bin/bash
user15:x:1016:1016::/home/user15:/bin/bash
user16:x:1017:1017::/home/user16:/bin/bash
user17:x:1018:1018::/home/user17:/bin/bash
user18:x:1019:1019::/home/user18:/bin/bash
user19:x:1020:1020::/home/user19:/bin/bash
user20:x:1021:1021::/home/user20:/bin/bash

上述腳本代碼中,使用變量i來控制用戶名稱的編號,初始賦值爲1,而且當取值大於20時終止循環。在循環體內部,經過語句「let i++」(等同於i= 'expr $i + 1')來使用變量i的值增長1,所以當執行第一次循環後i的值將變爲2,執行第二次循環後i的值將變爲3,......,依此類推。

若要刪除useraddress.sh ji腳本所添加的用戶,只需參考上述腳本代碼,將while循環體中添加用戶的命令序列改成刪除用戶的操做便可。

[root@centos01 ~]# vim deluseraddress.sh  <!--批量刪除用戶的腳本-->
#!/bin/bash
prefix="user"
i=1
while [ $i -le 20 ]
do
userdel -r ${prefix}$i
let i++
done
[root@centos01 ~]# chmod +x deluseraddress.sh  <!--腳本添加執行權限-->
[root@centos01 ~]# ./deluseraddress.sh     <!--運行腳本-->
[root@centos01 ~]# id user20      <!--確認執行結果-->
id: user20: no such user

3、使用case分支語句

一、case語句的結構

case語句主要適用於如下狀況:某個變量存在多種取值,須要對其中的每一種取值分別執行不一樣的命令序列。這種狀況與分支的if語句很是類似,只不過if語句須要判斷多個不一樣的條件,而case語句只是判斷一個變量的不一樣取值。case分支語句的語法結構以下所示:

case 變量值 in
模式1)
         命令序列1
       ;;
模式2)
            命令序列2
            ;;
            ......
*)
            默認命令序列
esac

在上述語句結構中,關鍵字case後面跟的是「變量值」,即「$變量名」,這點須要與for循環語句的結構加以區別。整個分支結構包括在case...esac之間,中間的模式一、模式二、......、對應爲變量的不一樣取值(程序指望的取值),其中做爲通配符,可匹配任意值。

二、case語句的執行流程

首先使用「變量值」與模式1進行比較,若取值相同則執行模式1後的命令序列,直到碰見雙分號「;;」後跳轉至esac,表示結束分支;若與模式1不相匹配,則繼續與模式2進行比較,若取值相同則執行模式2後的命令序列,直到碰見雙分號「;;」後跳轉至esac,表示結束分支......依此類推,若找不到任何匹配的值,則執行默認模式「*)」後的命令序列,直到碰見esac後結束分支。以下圖所示:

淺談Shell腳本中for循環、while循環及case分支語句

使用case分支語句時,有幾個值得注意的特色以下所述:

  • case行尾必須爲單詞「in」,每一模式必須以右括號「)」結束。
  • 雙分號「;;」表示命令序列的結束。
  • 模式字符串中,能夠用方括號表示一個連續的範圍,如「[0-9]」;還能夠用豎槓符號「|」表示或。
  • 最後的「)」表示默認模式,其中的至關於通配符。

三、case語句應用示例

1)檢查用戶輸入的字符類型

提示用戶從鍵盤輸入一個字符,經過case語句判斷該字符是否爲字母,數字或者其餘控制字符,並給出相應的提示信息。

[root@centos01 ~]# vim hitkey.sh  <!--建立編寫檢查用戶輸入的字符類型-->
#!/bin/bash  
read -p "請輸入一個字符,並按Enter鍵確認:" KEY
case "$KEY" in
 [a-z] | [A-Z])                  <!--匹配任意字母-->
        echo "您輸入的是 字母."
;;
 [0-9])                                  <!--匹配任意數字-->
        echo "您輸入的是 數字."
;;
 *)                      <!--默認模式,匹配任何字符-->
        echo "您輸入的是 空格、功能鍵或其餘控制字符."
esac
[root@centos01 ~]# chmod +x hitkey.sh <!--腳本添加執行權限 -->
[root@centos01 ~]# ./hitkey.sh <!--運行腳本並確認執行結果-->
請輸入一個字符,並按Enter鍵確認:k      <!--輸入字母k-->
您輸入的是 字母. 
[root@centos01 ~]# ./hitkey.sh             <!--運行腳本-->
請輸入一個字符,並按Enter鍵確認:6        <!--輸入數字6-->
您輸入的是 數字.
[root@centos01 ~]# ./hitkey.sh         <!--運行腳本-->
請輸入一個字符,並按Enter鍵確認:        <!--輸入字符或空格-->
您輸入的是 空格、功能鍵或其餘控制字符.

2)編寫系統服務腳本

編寫一個名爲myprog的系統服務腳本,經過位置變量$1指定的start、stop、restart控制參數,分別用來啓動、中止、重啓進程。

[root@centos01 ~]# vim services.sh <!--建立編寫系統服務腳本-->
#!/bin/bash
#chkconfig:35 90 21
#Description:test
case "$1" in
start)
        echo "正在啓動Apache服務...[肯定]"
;;
stop)
        echo "正在中止Apache服務...[肯定]"
;;
restart)
        echo "正在從新啓動Apache服務...[肯定]"
;;
*)
        echo "用法: $0 {start|stop|restart}"
;;
esac
[root@centos01 ~]# chmod +x services.sh <!--腳本添加執行權限-->
[root@centos01 ~]# ./services.sh stop <!--運行腳本中止服務-->
正在中止Apache服務...[肯定]
[root@centos01 ~]# ./services.sh start   <!--運行腳本啓動服務-->
正在啓動Apache服務...[肯定]
[root@centos01 ~]# ./services.sh restart     <!--運行腳本重啓服務-->
正在從新啓動Apache服務...[肯定]
[root@centos01 ~]# ./services.sh reload   <!--未提供此參數,按默認處理-->
用法: ./services.sh {start|stop|restart}

—————— 本文至此結束,感謝閱讀 ——————

相關文章
相關標籤/搜索