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