循环
循环执行,将某代码段重复运行多次,循环次数可以是已知,也可以是未知,需要有进入条件和退出条件
关键词:for, while, until
for循环
格式:for 变量名 in 列表; do循环体; done
执行机制:依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令:$(COMMAND)
(4) 使用glob,如:*.sh
(5) 变量引用:$@, $*
示例:
1、for fn in “*.txt”; do echo $fn; done 与 for fn in *.txt; do echo $fn; done 前一个加括号后搜索到的数据会被当做一个整体输出,而非一个数组形式;后一个的数据则是数组形式
2、扫描某个网段内存在的主机:
NETID=192.168.100.123
for h in {1..255}; do
{
If ping -c1 –w1 $NETID.$h &> /dev/null; then
Echo $NETID.$h is up | tee –a hostlist.txt
fi
}&
3、类C语言写法
for((sum=0,i=1;i<=n;++i)); do
Let sum+=i
done
Echo $sum
for特殊格式
双小括号方法,即((…))格式,也可以用于算术运算,双小括号方法也可以使bash Shell实现C语言风格的变量操作
I=10
((I++))
for循环的特殊格式:
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式)); do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
for循环练习题
1、判断/var/目录下所有文件的类型
2、添加10个用户user1-user10,密码为8位随机字符
3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和
5、计算100以内所有能被3整除的整数之和
6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
7、打印九九乘法表
8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
9、打印等腰三角形
10、猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少?
while循环
格式:
while CONDITION; do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
进入条件:CONDITION为true
退出条件:CONDITION为false
示例:
1、监控php-fpm服务是否在运行,如果挂了,则重启
SleepSec=10
while 1; do
if !killall php-fpm &>/dev/null; then
systemctl restart php-fpm &>/dev/null
echo “ At `date +‘%F %T’` php-fpm is restarted” >> /var/log/monitor.log
fi
sleep(SleepSec)
done
2、监控磁盘利用率
df | sed -rn ‘/^\/dev\/sd/s#^([^[:space:]]+).*([[:digit:]]+)% .*$#\1 \2#p’|while read part use; do
if [ $use –gt 80 ]; then
echo $part will be full,use:$use
fi
done
While循环练习题:
1、编写脚本,求100以内所有正奇数之和
2、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少
3、编写脚本,打印九九乘法表
4、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值
5、编写脚本,实现打印国际象棋棋盘
6、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo $RANDOM|md5sum|cut –c1-10 后的结果,请破解这些字符串对应的RANDOM值
until循环
格式:
until CONDITION; do
循环体
done
进入条件: CONDITION 为false
退出条件: CONDITION 为true
循环控制语句continue
用于循环体中
continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
格式:
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
循环控制语句break
用于循环体中
break [N]:提前结束第N层循环,最内层为第1层
格式:
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
循环控制shift命令
shift [n],用于将参量列表 list 左移指定次数,缺省为左移一次。
参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到 shift
示例:
1、脚本:doit.sh
#!/bin/bash
while [ $# -gt 0 ] # or (( $# > 0 )); do
echo $*
shift
done
2、脚本:shift.sh
#!/bin/bash
until [ -z "$1" ]; do
echo "$1"
shift
done
echo
练习