天天看點

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

目錄

1.流程控制語句:case

2.循環語句

(1)for----do-----done

1)取值清單有多種取值方式

2)清單中的複雜值

3)從變量中取值

4)從指令中取值

5)自定義shell分隔符

(2)C語言風格的for

(3)whlie-----do------done

(4)嵌套循環

1)批量添加a.txt檔案5個使用者

2)列印九九乘法表

3.3個shell腳本實戰

實戰1

實戰2

實戰3

1.流程控制語句:case

控制語句:用來實作對程式流程的選擇、循環、轉向和傳回等進行控制。

case是開關語句的一個組成部分;

它是根據變量的不同進行取值比較,然後針對不同的取值分别執行不同的指令操作

适用于多分支,是一個多選擇語句

case     變量或表達式     in

              變量或表達式1)

                     指令序列1

                     ;;

            變量或表達式2)

                     指令序列2

                     ;;

                     ……

                     *)  

                     預設指令序列

 esac

執行流程:

  •     首先使用“變量或表達式”的值與值1進行比較,若取值相同則執行值1後的指令序列,直到遇見雙分号“;; ”後跳轉至esac,表示分支結束;
  •     若與值1不相比對,則繼續與值2 進行比較,若取值相同則執行值2 後的指令序列,直到遇見雙分号“;; ”後跳轉至esac,表示結束分支。
  •     依次類推,若找不到任何比對的值,則執行預設模式“ *) ”後的指令序列,直到遇見esac後結束分支
  •     注意事項:

               1.“變量或表達式”後面必須為單詞in,每一個“變量或表達式”的值必須以右括号結束。取值可以為變量或常數。比對發現取值符合某一模式後,其間所有指令開始執行直至 ;; 

               2. 比對中的值可以是多個值,通過“|”來分隔

示例1:

case_1.sh腳本:

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

運作結果:

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

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

case2.sh腳本:

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

運作結果:

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

2.循環語句

(1)for----do-----done

文法格式:

for var in list

do

  commands

done

或:

for var in list ; do

  commands

done

1)取值清單有多種取值方式

可以直接讀取in 後面的值,預設以空格做分隔
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

2)清單中的複雜值

可以使用 引号或轉義字元”/”來加以限制
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

3)從變量中取值

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

4)從指令中取值

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

5)自定義shell分隔符

預設情況下,base shell會以空格、制表符、換行符做為分隔符。通過IFS來自定義為分隔符

指定單個字元做分隔符:

IFS=:   #以:冒号做分隔符

可以指定多個

如 IFS='\n':;"     #這個指派會将反斜杠、n、冒号、分号和雙引号作為字段分隔符。

注:$'\n'與'\n'時的差別

IFS='\n'    #将字元\和字元n作為IFS的換行符。

IFS=$'\n'   #真正地使用換行符做為字段分隔符。

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

(2)C語言風格的for

文法格式:

for ((i=0;i<10;i++))

do

   commmands

done

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

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

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

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

(3)whlie-----do------done

重複測試指令的條件,隻要條件成立就反複執行對應的指令操作,直到指令不成立或為假;

文法格式如下:

while 測試指令

do

指令

done

注意:

  •     避免陷入死循環  while true
  •     自增操作  let var++  
  •     自減操作  let var--  

示例1:降序輸出10到1的數字

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

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

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

(4)嵌套循環

1)批量添加a.txt檔案5個使用者

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
編寫腳本的思路
  • 1  明确腳本的功能
  • 2  編寫腳本時會使用到那些指令 ?  useradd    passwd   for
  • 3  把變化的資料使用變量表示
  • 4  選擇适合的流程控制  (選擇 、 循環 、分支)
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

2)列印九九乘法表

Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

3.3個shell腳本實戰

實戰1

将/opt目錄下所有的日志檔案全自動打包

#!/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 !"
           
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

實戰2

找出192.168.1.1-10網段中,伺服器已經關機的IP位址

#!/bin/bash
i=1
for (( i=1;i<10;i++ ))
do
  ping  -c  3  192.168.1.$i &> /dev/null
  if  [ $? -ne 0 ];then
     echo 192.168.1.$i is shutdown
  fi
done
           
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰

實戰3

批量建立帳号并生成随機密碼

#!/bin/bash
for i in boboyu{1..10}
do
      useradd $i
      pass=`date +%s|md5sum|cut -c 1-8`
      sleep 1
      echo "$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
           
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰