博文目錄
1、for循環語句
2、使用while循環語句
3、使用case分支語句mysql
當面對各類列表重複任務時,使用簡單的if語句已經難以知足要求,而順序編寫所有代碼更是顯得異常繁瑣,困難重重。這將可使用for循環語句很好的解決相似問題。sql
使用for循環語句時,須要指定一個變量及可能的取值列表,針對每一個不一樣的取值重複執行相同的命令序列,直到變量值用完退出循環。在這裏,「取值列表」稱爲for語句的執行條件,其中包括多個屬性相同的對象,須要預先指定(如通信錄)。
for循環語句的語法結構以下所示:shell
for 變量名 in 取值列表 do 命令序列 done
上述語句結構中,for語句的操做對象爲用戶指定名稱的變量,並經過in關鍵字爲該變量預先設置了一個取值列表,多個取值之間以空格進行分隔。位於do...done之間的命令序列稱爲循環體,其中的執行語句須要引用變量以完成相應的任務。vim
首先將列表中的第一個取值賦給變量,並執行do...done循環體中的命令序列;而後將列表中的第二個取值賦給變量,並執行循環體中的命令序列......依此類推,直到列表中的全部取值用完,最後將
跳至done語句,表示結束循環,以下圖所示:centos
根據公司人事部門給出的員工姓名的拼音列表,在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
for循環語句很是適用於列表對象無規律,且列表來源已固定(如某個列表文件)的場合。而對於要求控制循環次數、操做對象按數字順序編號、按特定條件執行重複操做等狀況,則更適合適用另外一種循環——while語句。ssh
適用while循環語句時,能夠根據特定的條件反覆執行一個命令序列,直到該條件再也不知足時爲止。在腳本應用中,應該避免出現死循環的狀況,不然後邊的命令操做將沒法執行。所以,循環體內的命令序列中應包括修改測試條件的語句,以便在適當的時候測試條件再也不成立,從而結束循環。
while循環語句的語法結構以下所示:tcpwhile 條件測試操做 do 命令序列 done
首先判斷while後的條件測試操做結果,若是條件成立,則執行do...done循環體中的命令序列;返回while後再次判斷條件測試結果,若是條件仍然成立,則繼續執行循環體,再次返回到while後,判斷條件測試結果.....如此循環,直到while後的條件測試結果再也不成立爲止,最後跳轉到done語句,表示結束循環。以下圖所示:ide
使用while循環語句時,有兩個特殊的條件測試操做,即true(真)和false(假)。使用true做爲條件時,表示條件永遠成立,循環體內的命令序列將無限執行下去,除非強制終止腳本(或經過exit語句退出腳本);反之,若使用false做爲條件,則循環體將不會被執行。這兩個特殊條件也能夠用在if語句的條件測試中。
在一些技術培訓和學習領域,出於實驗或測試的目的,須要批量添加用戶帳號,這些用戶的名稱中包含固定的前綴字串,並按照數字順序依次進行編號,帳號的數量每每也是固定的。
[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
case語句主要適用於如下狀況:某個變量存在多種取值,須要對其中的每一種取值分別執行不一樣的命令序列。這種狀況與分支的if語句很是類似,只不過if語句須要判斷多個不一樣的條件,而case語句只是判斷一個變量的不一樣取值。case分支語句的語法結構以下所示:
case 變量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; ...... *) 默認命令序列 esac
在上述語句結構中,關鍵字case後面跟的是「變量值」,即「$變量名」,這點須要與for循環語句的結構加以區別。整個分支結構包括在case...esac之間,中間的模式一、模式二、......、對應爲變量的不一樣取值(程序指望的取值),其中做爲通配符,可匹配任意值。
首先使用「變量值」與模式1進行比較,若取值相同則執行模式1後的命令序列,直到碰見雙分號「;;」後跳轉至esac,表示結束分支;若與模式1不相匹配,則繼續與模式2進行比較,若取值相同則執行模式2後的命令序列,直到碰見雙分號「;;」後跳轉至esac,表示結束分支......依此類推,若找不到任何匹配的值,則執行默認模式「*)」後的命令序列,直到碰見esac後結束分支。以下圖所示:
使用case分支語句時,有幾個值得注意的特色以下所述:
- case行尾必須爲單詞「in」,每一模式必須以右括號「)」結束。
- 雙分號「;;」表示命令序列的結束。
- 模式字符串中,能夠用方括號表示一個連續的範圍,如「[0-9]」;還能夠用豎槓符號「|」表示或。
- 最後的「)」表示默認模式,其中的至關於通配符。
提示用戶從鍵盤輸入一個字符,經過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鍵確認: <!--輸入字符或空格--> 您輸入的是 空格、功能鍵或其餘控制字符.
編寫一個名爲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}
—————— 本文至此結束,感謝閱讀 ——————