bash腳本編程:順序執行 選擇分支 循環執行shell
進入條件:編程
for:列表元素非空;bash
while:條件測試結果爲「真」ide
unitl:條件測試結果爲「假」測試
退出條件:spa
for:列表元素遍歷完成;日誌
while:條件測試結果爲「假」it
until:條件測試結果爲「真」for循環
循環控制語句:
class
continue:提早結束本輪循環,而直接進入下一輪循環判斷;
while CONDITION1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
示例:求100之內全部偶數之和;
#!/bin/bash
#
declare -i evensum=0
declare -i i=0
while [ $i -le 100 ]; do
let i++
if [ $[$i%2] -eq 1 ]; then
continue 注:當eq=1就開始不往下執行了,開始新一輪循環
fi
let evensum+=$i
done
echo "Even sum: $evensum"
break:提早跳出循環
退出方式:某個測試條件知足時,讓循環體執行break命令;
格式: while CONDITION1; do
CMD1
...
if CONDITION2; then
break
fi
done
建立死循環:
while true; do
循環體
done
示例:求100之內所奇數之和
#!/bin/bash
#
declare -i oddsum=0
declare -i i=1
while true; do
let oddsum+=$i
let i+=2
if [ $i -gt 100 ]; then
break 注:當$i大於100時退出循環
fi
done
sleep命令:程序的睡眠時間
格式:sleep NUMBER
練習:每隔3秒鐘到系統上獲取已經登陸用戶的用戶的信息;其中,若是logstash用戶登陸了系統,則記錄於日誌中,並退出;
#!/bin/bash
#
while true; do
if who | grep "^logstash\>" &> /dev/null; then
break
fi
sleep 3
done
echo "$(date +"%F %T") logstash logged on" >> /tmp/users.log
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#!/bin/bash
#
until who | grep "^logstash\>" &> /dev/null; do
sleep 3
done
echo "$(date +"%F %T") logstash logged on" >> /tmp/users.log
while循環的特殊用法(遍歷文件的行):
格式:
while read VARIABLE; do
循環體;
done < /PATH/FROM/SOMEFILE
依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將基賦值給VARIABLE變量;
示例:找出ID號爲偶數的用戶,顯示其用戶名、ID及默認shell;
#!/bin/bash
#
while read line; do
userid=$(echo $line | cut -d: -f3)
username=$(echo $line | cut -d: -f1)
usershell=$(echo $line | cut -d: -f7)
if [ $[$userid%2] -eq 0 ]; then
echo "$username, $userid, $usershell."
fi
done < /etc/passwd
for循環的特殊用法:
格式: for ((控制變量初始化;條件判斷表達式;控制變量的修正語句)); do
循環體
done
控制變量初始化:僅在循環代碼開始運行時執行一次;
控制變量的修正語句:每輪循環結束會先進行控制變量修正運算,然後再作條件判斷;
示例:求100之內全部正整數之和
#!/bin/bash
#
declare -i sum=0
for ((i=1;i<=100;i++)); do
let sum+=$i
done
echo "Sum: $sum."
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
示例:打印九九乘法表
#!/bin/bash
#
for ((j=1;j<=9;j++)); do
for ((i=1;i<=j;i++)); do
echo -e -n "${i}X${j}=$[${i}*${j}]\t"
done
echo
done