天天看點

shell程式設計 第三章 循環結構

文章目錄

    • 一、 循環結構類型
    • 二、for循環
      • 1、for循環概述
      • 2、兩種方法
        • (1)C語言風格
        • (2)Python風格(in的使用)
    • 三、while循環
      • 1、while概述
      • 2、DO WHILE 循環
    • 四、unti 循環
    • 五、expect互動
    • 六、循環控制語句
      • 1、break語句
      • 2、continue語句
      • 3、exit語句
      • 4、shift指令

一、 循環結構類型

常見的循環結構有三種:

  • for循環
  • while循環
  • until循環

二、for循環

1、for循環概述

(1)for語句需要定義一個變量和取值清單,根據不同的取值執行相同的指令,直到變量值用完。

(2)取值清單裡包含多個屬性相同的對象。

文法

for i in {取值範圍}   	 for是關鍵字 i是變量名 in是關鍵字
do                   	 循環體的開始

.....				     循環體

done                	 循環體的結束
           

2、兩種方法

(1)C語言風格

for ((i=1; i<=100; i++))   初值;條件;步長 
do
    echo $i
done

注:其中條件是判斷條件,for 循環根據結果來決定是否繼續下一次循環
增幅  i++  執行一次加一
差別:
i++===先指派在運算
++i===先運算在指派
i++ 即後加加,原理是:先自增,然後傳回自增之前的值
++i 即前加加,原理是:先自增,然後傳回自增之後的值
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(1)i++執行個體:
for  (( i=1;i <= 5;i++ ))
do
        let x=i++        #i2x1 i4x3  i6x5
        echo $i
        echo $x
done

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

(2)++i執行個體:
for  (( i=1;i <= 5;++i ))
do
        let x=++i          #i2x2 i4x4  i6x6
        echo $i
        echo $x
done

(3)請問一下情況得出的數字是多少:
for  (( i=1;i <= 5;i++))
do
        let x=++i         
        echo $i
        echo $x
done
           

(2)Python風格(in的使用)

for i in {1..100}
do
    echo $i
done

另一種寫法:seq的使用
for i in $(seq 1 100)
do
    echo $i
done
           

三、while循環

1、while概述

(1)根據特定條件反複執行一個指令序列,直到不滿足條件為止。

(2)編寫時可能會出現死循環,要避免這種情況發生

  • true(真)和false(假)為特殊條件測試操作,也可以在if語句的條件測試中使用
  • true作為條件時,表示條件永遠成立,無限執行,也就是死循環,需要強制終止
  • false作為條件時,表示條件不成立,不執行指令序列

文法

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

執行個體

每秒顯示一個數字,一次遞增+1
while :
do
let i++
sleep 1
echo $i
done
           

2、DO WHILE 循環

是一個和 while 循環類似的循環

while :先進行條件判斷,滿足就執行,不滿足則不執行

do while:先不管條件,先執行一回,然後在開始進行條件判斷

文法

do { 
要執行的代碼 
} while (條件)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=

下面這個代碼,條件一開始就不滿足,但是依舊會執行一次 do 後面 {} 内部的代碼
var num = 10
do {
  console.log('我執行了一次')
  num = num + 1
} while (num < 10)
           

四、unti 循環

unti 循環和 while 循環恰好相反,當判斷條件不成立時才進行循環,一旦判斷條件成立,就終止循環。

格式

until 條件測試操作    當後面的條件表達式為假的時候的才循環,為真的時候就停止了
do
    指令序列
done
           

執行個體

#!/bin/bash
x=1
until [ $x -ge 10 ]
do
		echo $x
		x=`expr $x + 1` 
done

x=1
while [ ! $x -ge 10 ]
do
		echo $x
		x=`expr $x + 1`
done
           

五、expect互動

作用:解決計算機互動現象

執行個體

通過expect解決ssh互動問題
yum  -y  install   expect  tcl  tclx  tcl-devel
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
#!/usr/bin/expect
spawn ssh [email protected]
expect {
        "yes/no" { send "yes\r";exp_continue }

        "password:" { send "666666\r" };

}

Interact
           

解釋:

  1. spawn expect 内部指令,啟動一個shell程式。
  2. expect 期望哪些内容
  3. yes/no 就send發送 yes ,\r 表示回車
  4. password 就send發送 666666
  5. exp_continue,跳過循環,就繼續下一條語句。
  6. interact 允許使用者互動

六、循環控制語句

1、break語句

在語句塊執行過程中終止循環,并且跳出整個循環

2、continue語句

在語句塊執行過程中終止目前循環,跳出該次循環,執行下一次循環。

3、exit語句

在語句塊執行過程中退出腳本

4、shift指令

#位置參數可以用shift指令左移。比如shift 3表示原來的$4現在變成$1,原來的$5現在變成$2等等,原來的$1、$2、$3丢棄,$0不移動。不帶參數的shift指令相當于shift

1。

執行個體:

若使用者要求 Shell 在不知道位置變量個數的情況下,還能逐個的把參數一一處理,也就是在 $1 後為 $2,在 $2 後面為 $3 等,則需要用shift把所有參數變成$1

[[email protected] script]# vim x_shift.sh
#!/bin/bash
until [ $# -eq 0 ]
do
echo "第一個參數為: $1 參數個數為: $#" 
shift
done
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
執行以上程式: 
[[email protected] script]# bash x_shift3.sh 1 2 3 4
結果顯示如下:
第一個參數為: 1 參數個數為: 4 
第一個參數為: 2 參數個數為: 3 
第一個參數為: 3 參數個數為: 2 
第一個參數為: 4 參數個數為: 1
           

注:從上可知 shift 指令每執行一次,變量的個數($#)減一,而變量值提前一位