for循环
for循环和while循环类似,但是for主要用于执行次数有限的循环,而不是守护进程和无限循环。for语常见的语法有两种,下面是例子:
for语法
第一种是for为变量取值型,语法如下:
for 变量名 in 变量取值列表
do
指令
done
或
for 变量名 in 变量取值列表;do
指令
done
for(( 语法
此语法我们称之为c语言型for循环语句,其语法结构如下:
for((exp1;exp2;exp3))
do
指令
done
for关键字后的双括号内是三个表达式,第一个是变量初始化(例如:i=0),第二个为变量的范围(例如:i<100),第三个为变量自增或自减(例如:i++)
练习:
1、 for循环在/root下创建10个html文件,其中每个文件需要包含10个随机小写字母和数字,加固定字符串oldchang。名称示例如:apns1yrmk_oldchang.html。使用三种方法
提示:使用三种方法生成随机字符串
openssl rand -hex 10 | cut -c 1-10
cat /proc/sys/kernel/random/uuid | md5sum |cut -c 1-10
date | md5sum |cut -c 1-10
2、 使用for循环,将上面文件名中的oldchang改为oldduan,并将扩展名全部大写,使用三种方法
3、 使用for循环和if,筛选出以下单词中字符数大于等于6的单词:I am teacher oldchang and I like eating and sleeping
4、 for循环打印99乘法表
解决
1、 for循环在/root下创建10个html文件,其中每个文件需要包含10个随机小写字母和数字,加固定字符串oldchang。名称示例如:apns1yrmk_oldchang.html。使用三种方法
提示:使用三种方法生成随机字符串
for n in `seq 10`;do
touch `openssl rand -hex 10 | cut -c 1-10`_oldchang.html
done
执行结果
[root@shell ~/html]# sh html.sh
[root@shell ~/html]# ls
213cbf897a_oldchang.html 717e95ca97_oldchang.html ba301f9c67_oldchang.html e6d8e4b6a0_oldchang.html
288109aaa5_oldchang.html 73f570e1fe_oldchang.html c9f7206526_oldchang.html html.sh
47cdb14eee_oldchang.html 953d2d26c4_oldchang.html d3e4a618ef_oldchang.html
2、 使用for循环,将上面文件名中的oldchang改为oldduan,并将扩展名全部大写,使用三种方法
for file in `ls`;do
mv $file ${file//_*/}_oldduan.HTML
done
执行结果
[root@shell ~/html]# sh mv.sh
[root@shell ~/html]# ls
213cbf897a_oldduan.HTML 717e95ca97_oldduan.HTML ba301f9c67_oldduan.HTML e6d8e4b6a0_oldduan.HTML
288109aaa5_oldduan.HTML 73f570e1fe_oldduan.HTML c9f7206526_oldduan.HTML html.sh_oldduan.HTML
47cdb14eee_oldduan.HTML 953d2d26c4_oldduan.HTML d3e4a618ef_oldduan.HTML
还可使用
ls |awk -F'_' '{print "mv",$0,$1 "_oldduan.HTML"}'|bash
rename "oldchang.html" "oldduan.HTML" *.html
3、 使用for循环和if,筛选出以下单词中字符数大于等于6的单词:I am teacher oldchang and I like eating and sleeping
for n in $1;do
if [ "${#n}" -gt 6 ];then
echo $n
fi
done
执行结果
[root@shell ~/html]# sh danchi.sh 'I am teacher oldchang and I like eating and sleeping'
teacher
oldchang
sleeping
还可用使用
[root@shell ~/html]# echo ${#a}
8
[root@shell ~/html]# echo $a|wc -L
8
[root@shell ~/html]# expr length $a
8
[root@shell ~/html]# echo $a|awk '{print length}'
8
4、 for循环打印99乘法表
for ((a=1;a<=9;a++));do
for ((n=1;n<=$a;n++));do
let mun=$a*$n
echo -en "$a*$n=$mun\t"
done
echo
done
执行结果
[root@shell /server/scripts]# sh chengfabiao2.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
for ((a=9;a>=1;a--));do
for ((n=1;n<=$a;n++));do
let mun=$a*$n
echo -en "$a*$n=$mun\t
done
echo
done
执行结果
[root@shell /server/scripts]# sh chengfabiao2.sh
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
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
4*1=4 4*2=8 4*3=12 4*4=16
3*1=3 3*2=6 3*3=9
2*1=2 2*2=4
1*1=1
案例实操
1、 给出一个网段,如10.0.0.0/24,如何判断网段内的所有ip是否能联通
for ((a=0;a<=254;a++));do
{
ping -c 1 -w 1 10.0.0.$a &>/dev/null
if [ $? -eq 0 ];then
echo 10.0.0.$a
fi }&
done
wait
{}的作用是把脚本放在后台.!wait 是脚本执行完自己退出脚本
执行结果
[root@shell ~/html]# sh ping.sh
10.0.0.7