溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

淺談Shell腳本中for循環(huán)、while循環(huán)及case分支語句

發(fā)布時(shí)間:2020-07-22 15:00:15 來源:網(wǎng)絡(luò) 閱讀:429 作者:俊偉祺i 欄目:系統(tǒng)運(yùn)維

博文目錄
一、for循環(huán)語句
二、使用while循環(huán)語句
三、使用case分支語句

一、for循環(huán)語句

當(dāng)面對各種列表重復(fù)任務(wù)時(shí),使用簡單的if語句已經(jīng)難以滿足要求,而順序編寫全部代碼更是顯得異常繁瑣,困難重重。這將可以使用for循環(huán)語句很好的解決類似問題。

1、for語句的結(jié)構(gòu)

使用for循環(huán)語句時(shí),需要指定一個(gè)變量及可能的取值列表,針對每個(gè)不同的取值重復(fù)執(zhí)行相同的命令序列,直到變量值用完退出循環(huán)。在這里,“取值列表”稱為for語句的執(zhí)行條件,其中包括多個(gè)屬性相同的對象,需要預(yù)先指定(如通訊錄)。
for循環(huán)語句的語法結(jié)構(gòu)如下所示:

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

上述語句結(jié)構(gòu)中,for語句的操作對象為用戶指定名稱的變量,并通過in關(guān)鍵字為該變量預(yù)先設(shè)置了一個(gè)取值列表,多個(gè)取值之間以空格進(jìn)行分隔。位于do...done之間的命令序列稱為循環(huán)體,其中的執(zhí)行語句需要引用變量以完成相應(yīng)的任務(wù)。

2、for語句的執(zhí)行流程

首先將列表中的第一個(gè)取值賦給變量,并執(zhí)行do...done循環(huán)體中的命令序列;然后將列表中的第二個(gè)取值賦給變量,并執(zhí)行循環(huán)體中的命令序列......依此類推,直到列表中的所有取值用完,最后將
跳至done語句,表示結(jié)束循環(huán),如下圖所示:

淺談Shell腳本中for循環(huán)、while循環(huán)及case分支語句

3、for語句應(yīng)用示例

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

根據(jù)公司人事部門給出的員工姓名的拼音列表,在Linux服務(wù)器中添加相應(yīng)的用戶賬戶,初始密碼均設(shè)置為“pwd@123”。其中,員工姓名列表中的賬號數(shù)量并不固定,而且除了要求賬號名稱是拼音之外,并無其他特殊規(guī)律。
針對上述要求,可先指定員工列表文件user.txt,然后編寫一個(gè)名為useradd.sh的shell腳本,從user.txt文件中讀取各用戶名稱,重復(fù)執(zhí)行添加用戶,設(shè)置初始密碼的相關(guān)操作。

[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     <!--添加執(zhí)行權(quán)限-->
[root@centos01 ~]# ./useradd.sh  <!--運(yùn)行批量創(chuàng)建用戶腳本-->
[root@centos01 ~]# tail -5 /etc/passwd      <!--確認(rèn)執(zhí)行結(jié)果-->
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循環(huán)體中添加用戶的命令序列改為刪除用戶的操作即可。

[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  <!--腳本文件添加執(zhí)行權(quán)限-->
[root@centos01 ~]# ./deluser.sh     <!--運(yùn)行批量刪除用戶腳本-->
[root@centos01 ~]# tail -5 /etc/passwd     <!--查看執(zhí)行結(jié)果-->
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

二、使用while循環(huán)語句

for循環(huán)語句非常適用于列表對象無規(guī)律,且列表來源已固定(如某個(gè)列表文件)的場合。而對于要求控制循環(huán)次數(shù)、操作對象按數(shù)字順序編號、按特定條件執(zhí)行重復(fù)操作等情況,則更適合適用另一種循環(huán)——while語句。

1、whie語句的結(jié)構(gòu)

適用while循環(huán)語句時(shí),可以根據(jù)特定的條件反復(fù)執(zhí)行一個(gè)命令序列,直到該條件不再滿足時(shí)為止。在腳本應(yīng)用中,應(yīng)該避免出現(xiàn)死循環(huán)的情況,否則后邊的命令操作將無法執(zhí)行。因此,循環(huán)體內(nèi)的命令序列中應(yīng)包括修改測試條件的語句,以便在適當(dāng)?shù)臅r(shí)候測試條件不再成立,從而結(jié)束循環(huán)。
while循環(huán)語句的語法結(jié)構(gòu)如下所示:

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

2、while語句的執(zhí)行流程

首先判斷while后的條件測試操作結(jié)果,如果條件成立,則執(zhí)行do...done循環(huán)體中的命令序列;返回while后再次判斷條件測試結(jié)果,如果條件仍然成立,則繼續(xù)執(zhí)行循環(huán)體,再次返回到while后,判斷條件測試結(jié)果.....如此循環(huán),直到while后的條件測試結(jié)果不再成立為止,最后跳轉(zhuǎn)到done語句,表示結(jié)束循環(huán)。如下圖所示:

淺談Shell腳本中for循環(huán)、while循環(huán)及case分支語句

使用while循環(huán)語句時(shí),有兩個(gè)特殊的條件測試操作,即true(真)和false(假)。使用true作為條件時(shí),表示條件永遠(yuǎn)成立,循環(huán)體內(nèi)的命令序列將無限執(zhí)行下去,除非強(qiáng)制終止腳本(或通過exit語句退出腳本);反之,若使用false作為條件,則循環(huán)體將不會被執(zhí)行。這兩個(gè)特殊條件也可以用在if語句的條件測試中。

3、while語句應(yīng)用示例

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

在一些技術(shù)培訓(xùn)和學(xué)習(xí)領(lǐng)域,出于實(shí)驗(yàn)或測試的目的,需要批量添加用戶賬號,這些用戶的名稱中包含固定的前綴字串,并按照數(shù)字順序依次進(jìn)行編號,賬號的數(shù)量往往也是固定的。

[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  <!--腳本添加執(zhí)行權(quán)限-->
[root@centos01 ~]# ./useraddress.sh    <!--運(yùn)行腳本-->
[root@centos01 ~]# grep "user" /etc/passwd | tail -20 <!--查看執(zhí)行結(jié)果-->
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,并且當(dāng)取值大于20時(shí)終止循環(huán)。在循環(huán)體內(nèi)部,通過語句“l(fā)et i++”(等同于i= 'expr $i + 1')來使用變量i的值增加1,因此當(dāng)執(zhí)行第一次循環(huán)后i的值將變?yōu)?,執(zhí)行第二次循環(huán)后i的值將變?yōu)?,......,依此類推。

若要刪除useraddress.sh ji腳本所添加的用戶,只需參考上述腳本代碼,將while循環(huán)體中添加用戶的命令序列改為刪除用戶的操作即可。

[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  <!--腳本添加執(zhí)行權(quán)限-->
[root@centos01 ~]# ./deluseraddress.sh     <!--運(yùn)行腳本-->
[root@centos01 ~]# id user20      <!--確認(rèn)執(zhí)行結(jié)果-->
id: user20: no such user

三、使用case分支語句

1、case語句的結(jié)構(gòu)

case語句主要適用于以下情況:某個(gè)變量存在多種取值,需要對其中的每一種取值分別執(zhí)行不同的命令序列。這種情況與分支的if語句非常相似,只不過if語句需要判斷多個(gè)不同的條件,而case語句只是判斷一個(gè)變量的不同取值。case分支語句的語法結(jié)構(gòu)如下所示:

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

在上述語句結(jié)構(gòu)中,關(guān)鍵字case后面跟的是“變量值”,即“$變量名”,這點(diǎn)需要與for循環(huán)語句的結(jié)構(gòu)加以區(qū)別。整個(gè)分支結(jié)構(gòu)包括在case...esac之間,中間的模式1、模式2、......、對應(yīng)為變量的不同取值(程序期望的取值),其中作為通配符,可匹配任意值。

2、case語句的執(zhí)行流程

首先使用“變量值”與模式1進(jìn)行比較,若取值相同則執(zhí)行模式1后的命令序列,直到遇見雙分號“;;”后跳轉(zhuǎn)至esac,表示結(jié)束分支;若與模式1不相匹配,則繼續(xù)與模式2進(jìn)行比較,若取值相同則執(zhí)行模式2后的命令序列,直到遇見雙分號“;;”后跳轉(zhuǎn)至esac,表示結(jié)束分支......依此類推,若找不到任何匹配的值,則執(zhí)行默認(rèn)模式“*)”后的命令序列,直到遇見esac后結(jié)束分支。如下圖所示:

淺談Shell腳本中for循環(huán)、while循環(huán)及case分支語句

使用case分支語句時(shí),有幾個(gè)值得注意的特點(diǎn)如下所述:

  • case行尾必須為單詞“in”,每一模式必須以右括號“)”結(jié)束。
  • 雙分號“;;”表示命令序列的結(jié)束。
  • 模式字符串中,可以用方括號表示一個(gè)連續(xù)的范圍,如“[0-9]”;還可以用豎杠符號“|”表示或。
  • 最后的“)”表示默認(rèn)模式,其中的相當(dāng)于通配符。

3、case語句應(yīng)用示例

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

提示用戶從鍵盤輸入一個(gè)字符,通過case語句判斷該字符是否為字母,數(shù)字或者其他控制字符,并給出相應(yīng)的提示信息。

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

2)編寫系統(tǒng)服務(wù)腳本

編寫一個(gè)名為myprog的系統(tǒng)服務(wù)腳本,通過位置變量$1指定的start、stop、restart控制參數(shù),分別用來啟動、停止、重啟進(jìn)程。

[root@centos01 ~]# vim services.sh <!--創(chuàng)建編寫系統(tǒng)服務(wù)腳本-->
#!/bin/bash
#chkconfig:35 90 21
#Description:test
case "$1" in
start)
        echo "正在啟動Apache服務(wù)...[確定]"
;;
stop)
        echo "正在停止Apache服務(wù)...[確定]"
;;
restart)
        echo "正在重新啟動Apache服務(wù)...[確定]"
;;
*)
        echo "用法: $0 {start|stop|restart}"
;;
esac
[root@centos01 ~]# chmod +x services.sh <!--腳本添加執(zhí)行權(quán)限-->
[root@centos01 ~]# ./services.sh stop <!--運(yùn)行腳本停止服務(wù)-->
正在停止Apache服務(wù)...[確定]
[root@centos01 ~]# ./services.sh start   <!--運(yùn)行腳本啟動服務(wù)-->
正在啟動Apache服務(wù)...[確定]
[root@centos01 ~]# ./services.sh restart     <!--運(yùn)行腳本重啟服務(wù)-->
正在重新啟動Apache服務(wù)...[確定]
[root@centos01 ~]# ./services.sh reload   <!--未提供此參數(shù),按默認(rèn)處理-->
用法: ./services.sh {start|stop|restart}

—————— 本文至此結(jié)束,感謝閱讀 ——————

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI