1.for循环语句和while循环类似,但是for循环主要是用于执行次数有限的循环,而不是守护进程及无限循环,那么for循环的语法如下:
for 变量名 in 变量取值列表 do 指令 done
在这种for循环语法中,在for关键字后面会有一个变量名,变量名会依次的获取in后面的变量取值列表的内容,每取一个然后循环do 和done之间的部分 也就是指令。 之后再次循环下一个变量取值列表 然后执行do done之间的部分,直到变量取值列表的最后一个值并进入循环体后才结束。
2.第二种语法就是C语言型的for循环语句如下:
for ((exp1;exp2;exp3)) do 指令 done
例如1:
for ((a=1;a<=10;a++)) do echo $a done
输出结果如下:
[root@yankerp shell]# sh for_check.sh 1 2 3 4 5 6 7 8 9 10 [root@yankerp shell]#
剖析:
for ((a=1;a<=10;a++)) #a=1 那么a就是1 a<=10 那么1<10 但是不等于10 所以后面a++增加1 do echo $a #第一次输入$a是1 那么第二次 a++ 等于a+1 也就是1+1 第二次输出2 直到a=10 done #结束
以上的for循环类似于while语句 如下:
a=1 while ((a<=10)) do echo $a ((a++)) done
输出结果如下:
[root@yankerp shell]# sh while.sh 1 2 3 4 5 6 7 8 9 10 [root@yankerp shell]#
如果希望程序能够持续运行,那么while循环是最好的选择。
如果是限次循环的话,则多用for循环!!!
3、for循环的基础实践
例1:使用for循环打印 1 2 3 4 5 数字如下:
#!/bin/bash for zhangsan in 1 2 3 4 5 do echo $zhangsan done
在for关键字后面会有一个变量名,变量名会依次的获取in后面的变量取值列表的内容,每取一个然后循环do 和done之间的部分 也就是指令。 之后再次循环下一个变量取值列表 然后执行do done之间的部分,直到变量取值列表的最后一个值并进入循环体后才结束。
最后输出内容:
[root@yankerp shell]# sh for_check.sh 1 2 3 4 5 [root@yankerp shell]#
例如2:使用{}来打印1 2 3 4 5
在前几篇文章中有提过{}的用处,例如打印1-15 或者 a-z
[root@yankerp shell]# echo {1..15} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@yankerp shell]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z [root@yankerp shell]#
使用for循环结合{}循环
[root@yankerp shell]# cat for_check.sh #!/bin/bash for zhangsan in {1..5} #或者 {a..z} do echo $zhangsan done [root@yankerp shell]# sh for_check.sh 1 2 3 4 5 [root@yankerp shell]#
输出a-z
[root@yankerp shell]# sh for_check.sh a b c d e f g h i j k l m n o p q r s t u v w x y z [root@yankerp shell]#
实例3:批量修改文件后缀
我们看到 在这个目录下有这么多文件,但是他们的后缀名不同,但是需求就是我想把以txt格式的文件,都改为.sh的 第一种方法,一条条的手动改,第二种方法如下:
1.首先我们要改后缀名,我们先定义一个变量测试
[root@yankerp data]# aaa=csdn.txt [root@yankerp data]# echo $aaa csdn.txt [root@yankerp data]# echo $aaa | cut -d . -f1 csdn [root@yankerp data]# echo "`echo $aaa | cut -d . -f1`".sh csdn.sh [root@yankerp data]#
剖析如下:
[root@yankerp data]# aaa=csdn.txt #定义一个变量 aaa=csdn.txt 那么aaa就是csdn.txt [root@yankerp data]# echo $aaa #echo $aaa 就是 csdn.txt csdn.txt #输出的结果 [root@yankerp data]# echo $aaa | cut -d . -f1 #在这里我们使用cut命令通过.为分隔符截取第一段 csdn #截出来的csdn 那么我们想,这时候在csdn后面加上一个.sh 是不是就好了 如下: [root@yankerp data]# echo "`echo $aaa | cut -d . -f1`".sh #在以上的命令后面加上.sh 就实现了这个效果 csdn.sh [root@yankerp data]#
以上是一个变量的方法,那么接下来编写for循环修改的方式
2.我们是需要把txt后缀改为sh结尾,那么我们肯定是要找出在这里目录下所有以txt文件结尾的文件如下:
[root@yankerp data]# ls | grep txt$ a.txt b.txt c.txt d.txt uuub.txt [root@yankerp data]#
到这里我想应该很清楚了,接下来修改的方式和上面变量的方式一样 如下:
#!/bin/bash cd /root/data || { echo "进入目录失败!!!" exit 1 } for zhangsan in `ls | grep txt$` do mv $zhangsan `echo $zhangsan | cut -d . -f1`.sh done
3.剖析:
#!/bin/bash cd /root/data || { #进入文件目录 echo "进入目录失败!!!" #判断是否进入成功!!! exit 1 } for zhangsan in `ls | grep txt$` #张三是一个变量 那么后面跟着那条命令 也就是所有以txt结尾的文件,开始循环 do mv $zhangsan `echo $zhangsan | cut -d . -f1`.sh #这个就是上面的那个变量的命令。 done
修改如下:
实例4:批量解压文件,如下:
在这个目录下我们看到有很多的包,但是有.tar.gz 的 有rar的 有zip的包,但是呢,我就想解压.tar.gz的包,第一种方法,手动一个个解压,那么第二种方式如下:
1.查看以.tar.gz的包有几个
2.编写脚本如下:
#!/bin/bash cd /root/data || { echo "进入目录失败!!!" exit 1 } for zhangsan in `ls | grep .tar.gz$` do tar zxf $zhangsan -C /root/log done if [ "$?" -eq 0 ];then echo ".tar.gz 成功!!!" else echo "失败!!!" fi
运行结果如下:
实例5:开发批量创建用户脚本
首先批量创建用户还是很好实现的,如下:
#!/bin/bash NAME=yankai for zhangsan in `seq -w 1 5` do useradd $NAME$zhangsan done if [ "$?" -eq 0 ];then echo "创建用户成功!!!" else echo "创建用户失败!!!" exit 1 fi
运行如下:
但是问题来了,怎么去给用户加密码,用户是肯定需要密码的,普通我们给一个用户设置密码如下:
[root@yankerp ~]# echo 123456 | passwd --stdin zhangsan 更改用户 zhangsan 的密码 。 passwd:所有的身份验证令牌已经成功更新。 [root@yankerp ~]#
我们随机匹配密码可以通过$RANDOM|md5sum进行加密的方式来截取前8位 如下:
那么接下来我们就有一定的思路去写脚本了如下:
#!/bin/bash . /etc/init.d/functions NAME=yankai ZF=`seq 1 10` for user in $ZF do useradd $NAME$user PASS="`echo $RANDOM|md5sum | cut -c 1-8`" echo "$PASS" | passwd --stdin $NAME$user &>/dev/null echo "$NAME$user的密码为:$PASS" if [ "$?" -eq 0 ] then action "$NAME$user is ok!" /bin/true else action "$NAME$user not ok!" /bin/false exit 1 fi done
执行如下:
剖析如下:
#!/bin/bash . /etc/init.d/functions #加载函数库 NAME=yankai #定义名字为yankai ZF=`seq 1 10` #这个取1-10的数字 for user in $ZF #for循环 user是变量 $ZF取数值 do useradd $NAME$user #创建yankai账户并+1 PASS="`echo $RANDOM|md5sum | cut -c 1-8`" #定义随机密码 取前8位 echo "$PASS" | passwd --stdin $NAME$user &>/dev/null #设置用户密码 echo "$NAME$user的密码为:$PASS" #输出用户密码 if [ "$?" -eq 0 ] #进行判断 then action "$NAME$user is ok!" /bin/true else action "$NAME$user not ok!" /bin/false exit 1 fi done #以上内容一直循环 直到seq 1-10 已经达到了10 那么退出循环!!
案例6:开发检测URL脚本
内容如下:
#!/bin/bash . /etc/init.d/functions function URL_Check(){ wget --spider http://$1 &>/dev/null if [ "$?" -eq 0 ]; then action "$1 检测成功!" /bin/true else action "$1 检测失败!" /bin/false fi } web=" www.baidu.com www.jd.com www.taobao.com www.4399.com www.baidu123.com www.ywydhajkw.com www.hahahhaha.conm www.dhadwkldm.com " for url in $web do URL_Check $url done
运行结果如下:
剖析如下: