循环执行:for循环、while循环、until循环;
进入条件:
for循环:列表元素非空;
while循环:条件测试结果为”真”;
until循环:条件测试结果为”假”;
退出条件:
for循环:列表元素遍历完成;
while循环:条件测试结果为”假”;
until循环:条件测试结果为”真”;
***************************
循环控制语句1:
continue: 提前结束本轮循环,直接进入下一轮循环判断;
continue语法结构(以while循环为例):
while CONDITION1; do CMD1 ... if CONDITION2; then continue fi CMD2 CMD3 ... CMDn done
语法结构解释:
if语句判断CONDITION2的结果为”真”时,会触发’then’操作,结果是’continue’;
在循环语句段落中碰到’continue’,则本轮的循环会提前结束,也就是说’continue’下面的CMD2..CNDn都不会执行;
而是直接进入下一轮循环的判断;
举例: 计算100以内的正整数的偶数之和;
#!/bin/bash # declare -i even_sum=0 declare -i i=0 while [ $i -le 10 ]; do let i++ if [ $[$i%2] -eq 1 ]; then continue fi let even_sum+=$i done echo "even sum is $even_sum"
循环控制语句2:
break : 提前跳出循环;
break语法结构(以while循环为例):
while CONDITION1; do CMD1 ... if CONDITION2; then break fi CMD2 CMD3 ... CMDn done
举例: 计算100以内的正整数的奇数之和;
#!/bin/bash # declare -i odd_sum=0 declare -i i=1 while true; do let odd_sum+=$i let i++ if [ $i -gt 100 ]; then break fi done
脚本解释:
‘true’表示死循环;当’$i’大于100时,直接跳出死循环;
举例: 每隔3秒钟查看用户maha是否有登录系统,如果登录系统则提示,并退出脚本;
#!/bin/bash # while true; do who | grep "^maha\>" &> /dev/null if [ $? -eq 0 ]; then echo "user maha is login system." echo -e "at `date +%m-%d-%Y\ %T`.\tuser maha is login system." >> maha_login.log break else echo "user maha is not login system." sleep 3 fi done
上面时间命令的引用,下面语句相同效果:
`date +$Y-%m-%d\ %T`
`date +%F\ %T`
$(date +”%F %T”)
while循环的特殊用法:遍历文件的行;
语法结构:
while read VARIABLE; do
循环体
done < /PATH/FROM/SOMEFILE
语法结构解释:依次读取’/PATH/FROM/SOMEFILE’文件中的每一行,且将其赋值给’VARIABLE’变量;
举例:找出ID号为偶数的用户,显示其用户名、ID号及默认shell;
#!/bin/bash # while read line; do user_id=$(echo $line | cut -d: -f3) user_name=$(echo $line | cut -d: -f1) user_shell=$(echo $line | cut -d: -f7) if [ $[$user_id%2] -eq 0 ]; then echo -e "$user_name\t$user_id\t$user_shell." fi done < /etc/passwd
#!/bin/bash # while read line; do user_id=$(echo $line | cut -d: -f3) if [ $[$user_id%2] -eq 0 ]; then echo "$line" | cut -d: -f1,3,7 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 is $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
逆序打印九九乘法表:
#!/bin/bash # for ((j=9;j>=1;j--)); do for ((i=1;i<=j;i++)); do echo -e -n "${i}x${j}=$[${i}*${j}]\t" done echo done