結構化命令case和for、while循環

本節所講內容:

  • 21.1 case - 流程控制語句
  • 21.2 循環語句
  • 21.3 while循環語句和循環嵌套
  • 21.4 實戰-3個shell腳本實戰

21.1 流程控制語句:case

控制語句:用來實現對程序流程的選擇、循環、轉向和返回等進行控制。case是開關語句的一個組成部分;
它是根據變量的不同進行取值比較,然後針對不同的取值分別執行不同的命令操作
適用於多分支,是一個多選擇語句

case     變量或表達式     in
              變量或表達式1)
                     命令序列1
                     ;;
            變量或表達式2)
                     命令序列2
                     ;;
                     ……
                     *)  
                     默認命令序列
 esac
case語句執行流程控制:

執行流程:

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

注意事項:

	“變量或表達式”後面必須爲單詞in,每一個“變量或表達式”的值必須以右括號結束。取值可以爲變量或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;; 
	匹配中的值可以是多個值,通過“|”來分隔
例1:編寫一個操作文件的腳本
[root@xuegod63 ~]# cat case-1.sh 
#########################################################################
# File Name: case-1.sh
# Author: xuegod
#########################################################################
#!/bin/bash
cat <<eof
****************
** 1. backup  **
** 2. copy    **
** 3. quit    **
****************
eof
read -p "Input a choose: " OP
case $OP in
	1|backup)
		echo "BACKUP......"
		;;
	2|copy)
		echo "COPY....."
		;;
	3|quit)
		exit
		;;
	*)
		echo error
esac

例2:編寫一個啓動apache服務腳本

[root@xuegod63 ~]# yum install httpd -y
[root@xuegod63 ~]# vim  case-2.sh
#!/bin/bash
case $1 in
	start)
		systemctl $1 httpd
		ps aux|grep httpd
		echo "httpd start"
		;;
	stop)
		systemctl $1 httpd
		ps aux|grep httpd
		echo "httpd stop"
		;;
	status)
		systemctl $1 httpd
		;;
	restart)
		systemctl $1 httpd
		echo "httpd restart"
		;;
	*)
		echo "USAGE: $0  start|stop|restart"
esac

Linux架構師高薪入口:
1.學神IT教育官方網站: http://xuegod.ke.qq.com
2.10年行業資深老鳥MK:QQ2659153446
3.加入Linux技術交流QQ羣:722287089,即可獲得以下福利:
①定期分享免費學習資料與視頻(工具+筆記+拓展實戰)
②10年行業資深老鳥在線答疑:技能+實戰+項目分享+高薪就業
③有機會免費領取Linux雲計算集羣架構師4冊書籍

21.2 循環語句
21.2.1 for-do-done

語法格式:

for var in list 
do
  commands
done
或:
for var in list ; do
  commands
done

取值列表有多種取值方式,比如
可以直接讀取in 後面的值,默認以空格做分隔

[root@xuegod63 ~]# vim for-1.sh
#!/bin/bash
for var in a1 b1 c1 d1
do
	echo the text is $var
done

列表中的複雜值,可以使用 引號或轉義字符”/”來加以約束

[root@xuegod63 ~]# cat for-2.sh   
#!/bin/bash
for var in a1 b1 "c1 d1" e2 "hello world"
do
	echo the text is $var
done
[root@xuegod63 ~]# cat for-3.sh 
#!/bin/bash
for var in a1 b\'1 "c1 d1" e2 "hello world" I\'s a22 
do
	echo the text is $var
done

從變量中取值

[root@xuegod63 ~]# cat for-4.sh 
#!/bin/bash
list="a1 b1 c1 d1"
for i in $list
do
	echo is a $i
done

4、從命令中取值

[root@xuegod63 ~]# cat for-5.sh   #以空格做分隔符
#!/bin/bash
for i in `cat  /etc/hosts`
do
	echo "$i"
done

5、自定義shell分隔符

  • 默認情況下,base shell會以空格、製表符、換行符做爲分隔符。通過IFS來自定義爲分隔符 指定單個字符做分隔符: IFS=:
    #以:冒號做分隔符 可以指定多個 如 IFS=’\n’:;" #這個賦值會將反斜槓、n、冒號、分號和雙引號作爲字段分隔符。

    注:KaTeX parse error: Expected 'EOF', got '\n' at position 2: '\̲n̲'與'\n'時的區別 IFS=…’\n’
    #正真的使用換行符做爲字段分隔符。

    [root@xuegod63 ~]# cat for-6.sh #指定以\n回車做爲 for語句的分隔符
    #!/bin/bash
    IFS=KaTeX parse error: Expected 'EOF', got '\n' at position 2: '\̲n̲' for i in `ca…i"
    done
    [root@xuegod63 ~]# cat for-7.sh #以:冒號做分隔符
    #!/bin/bash
    IFS=:
    list=head -1 /etc/passwd
    for i in $list
    do
    echo $i
    done

6、C語言風格的for

語法格式:
for ((i=0;i<10;i++))
do
   commmands
done

例1:單個變量。 輸出1到10之間的數字

[root@xuegod63 ~]# cat for-8.sh 
#!/bin/bash
for ((  i=1  ; i<=10  ;  i++  ))
do
	echo num is $i
done

注:
互動:  i++ 這一條語句在for循環體中哪個位置執行?

for ((  i=1  ; i<=10  ;    ))   #i=1 只賦值一次。然後執行 i <= 10
do
		echo num is $i
i=$(($i+1))    # i++在這裏執行。 當for循環體中所有命令執行完後,再執行i++
done

例2:多個變量。 同時輸出1-9的升序和降序

[root@xuegod63 ~]# cat for-8.sh 
#!/bin/bash
for ((a=1,b=9 ; a<10 ; a++,b--))
do
	echo num is $a - $b 
done

Linux架構師高薪入口:
1.學神IT教育官方網站: http://xuegod.ke.qq.com
2.10年行業資深老鳥MK:QQ2659153446
3.加入Linux技術交流QQ羣:722287089,即可獲得以下福利:
①定期分享免費學習資料與視頻(工具+筆記+拓展實戰)
②10年行業資深老鳥在線答疑:技能+實戰+項目分享+高薪就業
③有機會免費領取Linux雲計算集羣架構師4冊書籍

21.3 while循環語句和循環嵌套
21.3.1 while-do-done

重複測試指令的條件,只要條件成立就反覆執行對應的命令操作,直到命令不成立或爲假;
語法格式如下:
while 測試命令
do
命令
done

注意:避免陷入死循環 while true
例1:降序輸出10到1的數字

[root@xuegod63 ~]# cat while-1.sh 
#!/bin/bash
var=10
while [ $var -gt 0 ]
do
		echo $var
		var=$[$var-1]
done

例2:輸出如下圖兩數相乘的效果

自增操作  let var++  
自減操作  let var--  
[root@xuegod63 ~]# cat while-2.sh
#!/bin/bash
num=1
while [ $num -lt 10 ]
do
        sum=$((  $num * $num ))
        echo  "$num * $num = $sum"
        ((num++))
#       let num++
done

21.3.2 嵌套循環

例1:批量添加a.txt文件5個用戶

[root@xuegod63 ~]# vim a.txt   #添加5個用戶
mk
cd
ls
find
ln

編寫腳本的思路

  • 1 明確腳本的功能

  • 2 編寫腳本時會使用到那些命令 ? useradd passwd for

  • 3 把變化的數據使用變量表示

  • 4 選擇適合的流程控制 (選擇 、 循環 、分支)

    [root@xuegod63 ~]# cat for-adduser.sh
    #!/bin/bash
    for name in cat /root/a.txt
    #for name in $(cat /root/a.txt)
    do
    id $name &> /dev/null
    if [ $? -ne 0 ];then
    useradd $name
    echo “123456” |passwd --stdin $name &> /dev/null
    echo “user $name created”

         else
                 echo "user $name is exist"
         fi
    

    done

注:&> 是正確和錯誤的信息都重定向到/dev/null裏面

例2 :打印九九乘法表

  • 注:外層循環循環行,內層循環循環列 規律: 內層循環的變量<=外層循環的變量

    [root@xuegod63 ~]# cat for-for.sh
    for i in seq 9
    do
    for j in seq $i
    do
    echo -n "ii*j= echo $(($i*$j)) "
    done
    echo " "
    done
    21.4 實戰-3個shell腳本實戰

    21.4.1 實戰-將/opt目錄下所有的日誌文件全自動打包

    [root@xuegod63 ~]# vim log-back.sh
    #!/bin/sh
    SRC_DIR=/var/log/
    DES_DIR=/opt/backup/date +%Y%m%d
    if
    [ ! -d $DES_DIR ] ; then
    mkdir -p $DES_DIR
    fi
    for i in find $SRC_DIR -name "*.log"
    do
    tar czf $i.tgz $i
    done
    mv /var/log/*.tgz $DES_DIR
    ls -lh $DES_DIR
    echo “The scripts exec end, Files tar successfully !”
    21.4.2 實戰-找出192.168.1.1-10網段中,服務器已經關機的IP地址

    [root@xuegod63 ~]# vim ping.sh
    #!/bin/bash
    i=1
    for (( i=1;i<10;i++ ))
    do
    ping -c 3 192.168.1.$i &> /dev/null
    if [ ?ne0];thenecho192.168.1.? -ne 0 ];then echo 192.168.1.i is shutdown
    fi
    done
    21.4.3 批量創建帳號並生成隨機密碼

    [root@xuegod63 ~]# vim adduser.sh
    #!/bin/bash
    for i in xuegoda{1…10}
    do
    useradd ipass=date+sleep1echo&quot;i pass=`date +%s|md5sum|cut -c 1-8` sleep 1 echo &quot;i:$pass" >> /tmp/passwd.log
    echo $pass |passwd --stdin $i > /dev/null 2>&1
    if [ $? -eq 0 ];then
    echo “create user is successfully!”
    else
    echo “create user is failed!”
    fi
    done
    Linux架構師高薪入口:
    1.學神IT教育官方網站: http://xuegod.ke.qq.com
    2.10年行業資深老鳥MK:QQ2659153446
    3.加入Linux技術交流QQ羣:722287089,即可獲得以下福利:
    ①定期分享免費學習資料與視頻(工具+筆記+拓展實戰)
    ②10年行業資深老鳥在線答疑:技能+實戰+項目分享+高薪就業
    ③有機會免費領取Linux雲計算集羣架構師4冊書籍

微信公衆號:
在這裏插入圖片描述
MK老師微信號:
在這裏插入圖片描述
總結:

  • 21.1 case - 流程控制語句
  • 21.2 循環語句
  • 21.3 while循環語句和循環嵌套
  • 21.4 實戰-3個shell腳本實戰
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章