14.3、bash腳本編程

1、bash腳本編程語句控制:

    順序執行

    選擇執行

    循環執行 for、while、until


進入條件退出條件
for列表元素非空

列表元素遍歷完成

while條件測試結果爲真條件測試結果爲假
until條件測試結果爲假條件測試結果爲真




2、循環控制語句

    循環控制語句用在循環體中,用於控制循環執行行爲的

    有兩種控制循環執行行爲的語句:continue、break

  continue語句:提前結束本輪循環,而直接進入下一輪玄幻判斷(一般用在語句中間)

  break語句:提前跳出循環,可以用在循環執行語句的任何位置。


格式:以while循環爲例

while CONDITION1 ;do

    command1

    command2    

    if CONDITION2;then

        command3

        continue   //提前結束本輪循環

    fi

    command#

done

while CONDITION1;do

   command1

    command2

    if CONDITION2;then

        bareak    //跳出整個while循環

    fi

done


創建死循環:while示例

while true ;do

    循環體

done

注意:死循環退出方式,某個測試條件滿足時,讓死循環執行break命令



示例:求100以內所有偶數的和:(conutine示例)

while循環:

[root@localhost sh]# cat sum_os.sh 

#!/bin/bash

declare -i i=0

declare -i sum=0

while [ $i -le 100 ];do

let i++

if [ $[$i%2] -eq 1 ];then

continue

fi

sum=$[$sum+$i]

done

echo "sum:$sum"

[root@localhost sh]# 



[root@localhost sh]# bash sum_os.sh 

sum:2550


until循環:

[root@localhost sh]# cat until_os.sh 

#!/bin/bash

declare -i i=0

declare -i sum=0

until [ $i -gt 100 ];do

let i++

if [ $[$i%2] -eq 1 ];then

continue

fi

sum=$[$sum+$i]

done

echo "sum:$sum"

[root@localhost sh]# 



[root@localhost sh]# bash until_os.sh 

sum:2550

[root@localhost sh]# 


for循環:

[root@localhost sh]# cat for_os.sh

#!/bin/bash

declare i i=0

declare i sum=0

for i in {0..100};do

let i++

if [ $[$i%2] -eq 1 ];then

continue

fi

sum=$[$sum+$i]

done

echo "sum:$sum"    

[root@localhost sh]# 



[root@localhost sh]# bash for_os.sh 

sum:2550


bash -n 腳本名 :檢查是否有語法錯誤

bash -x 腳本名 :顯示腳本執行過程


示例:求100以內正整奇數之和,用死循環來實現

[root@localhost sh]# cat while_sum_js_dead.sh

#!/bin/bash

declare i i=1

declare i sum=0

while true ;do

let sum+=$i

let i+=2

    if [ $i -gt 100 ];then

break

fi

done

echo "sum:$sum"

[root@localhost sh]# 

[root@localhost sh]# bash while_sum_js_dead.sh 

sum:2500




3、sleep命令:延遲指定時長

  格式:#sleep NUMBER  //NUMBER爲數字,單位爲秒

    如:#sleep 3 


sleep命令用在腳本中示例:

練習:每隔3秒鐘到系統上獲取已經登錄用戶的用戶信息,其中,如果logstash用戶用戶登錄了系統,則記錄與腳本中,並退出

方法一:

[root@localhost sh]# cat user_login.sh 

#!/bin/bash

while true ;do

if who |grep "^logstash\>" &>/dev/null;then

break

fi

sleep 3

done

echo "$(date) logstash logged on >>/tmp/user.log"


[root@localhost sh]# 


方法二:

[root@localhost sh]# cat until_user_logon.sh

#!/bin/bash

until who | grep "^logstash\>" &> /dev/null; do

sleep 3

done

echo "$(date +%F-%T) logstash is logon"


[root@localhost sh]# 



注意:date +%F:顯示完成日期

    date +%T:顯示完整時間

[root@localhost sh]# date +%F

2018-01-14

[root@localhost sh]# date +%T

12:02:51

[root@localhost sh]# 





4、while循環的特殊用法:遍歷文件的每一行

  格式:

while read VARIABLE;do     //read爲關鍵字,VARIABLE爲變量

    循環體

done < /PATH/FROM/SOMEFILE


實現的功能:一次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將其賦值給VARIABLE變量。


示例:找出ID爲偶數的用戶,顯示其用戶名、ID、及默認shell

[root@localhost sh]# cat  while_read.sh

#!/bin/bash

while read var_line;do

userid=$(echo "${var_line} "| cut -d: -f3)

username=$(echo "${var_line} "| cut -d: -f1)

usershell=$(echo "${var_line}" |cut -d: -f7)

if [ $[$userid%2] -eq 0 ];then

echo "$username,$userid,$usershell"

fi

done </etc/passwd

[root@localhost sh]# 


5、for循環的特殊用法:

  格式:

    for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式));do    //注意,要寫兩個括號(( ))

        循環體

    done

實現的功能:while的三個語句用一個for語句實現


執行的次序:

    控制變量初始化:僅在循環代碼開始執行時,運行一次

    控制變量的修正表達式:每輪循環結束會先進行控制變量修正表達式運算,而後在做條件判斷

    條件判斷:> < = <= >=,直接寫條件比較

示例:求100以內的正整數之和

[root@localhost sh]# cat for_sum_100.sh

#!/bin/bash

declare -i sum=0

for (( i=1;i<=100;i++));do

let sum+=$i

done

echo "sum:$sum"


[root@localhost sh]# 

[root@localhost sh]# bash for_sum_100.sh

sum:5050

[root@localhost sh]# 


示例:打印九九乘法表

[root@localhost sh]# cat  for_99.2.sh

#!/bin/bash

for ((i=1;i<=9;i++));do

for ((j=1;j<=i;j++));do

echo -e -n "${i}*${j}=$[${i}*${j}]\t"

done

    echo " "

done

[root@localhost sh]# 

[root@localhost sh]# bash  for_99.2.sh

1*1=1  

2*1=2 2*2=4  

3*1=3 3*2=6 3*3=9  

4*1=4 4*2=8 4*3=12 4*4=16  

5*1=5 5*2=10 5*3=15 5*4=20 5*5=25  

6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36  

7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49  

8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64  

9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章