亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

發布時間:2020-07-22 15:00:15 來源:網絡 閱讀:437 作者:俊偉祺i 欄目:系統運維

博文目錄
一、for循環語句
二、使用while循環語句
三、使用case分支語句

一、for循環語句

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

1、for語句的結構

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

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

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

2、for語句的執行流程

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

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

3、for語句應用示例

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

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

[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

二、使用while循環語句

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

1、whie語句的結構

適用while循環語句時,可以根據特定的條件反復執行一個命令序列,直到該條件不再滿足時為止。在腳本應用中,應該避免出現死循環的情況,否則后邊的命令操作將無法執行。因此,循環體內的命令序列中應包括修改測試條件的語句,以便在適當的時候測試條件不再成立,從而結束循環。
while循環語句的語法結構如下所示:

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

2、while語句的執行流程

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

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

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

3、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

三、使用case分支語句

1、case語句的結構

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

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

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

2、case語句的執行流程

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

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

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

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

3、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}

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彭山县| 东城区| 犍为县| 枞阳县| 曲阜市| 安顺市| 老河口市| 旬阳县| 勐海县| 五指山市| 新密市| 大兴区| 鄂州市| 富蕴县| 姜堰市| 开封市| 恩平市| 萨嘎县| 五家渠市| 台东县| 双辽市| 洪泽县| 南乐县| 嘉善县| 淮滨县| 浦东新区| 梨树县| 阳城县| 凤庆县| 龙门县| 如东县| 绥德县| 义马市| 屯门区| 建宁县| 永登县| 嘉善县| 曲水县| 温泉县| 大连市| 保康县|