[toc]编程
重复执行一系列命令在 编程中很常见。一般你须要重复一组命令直到达到某个特定条件,好比处理某个目录下的全部文件、系统上的全部用户或者是某个文本文件中的全部行。vim
常见的两种循环,在脚本中广泛被用到。bash
for循环
while循环ide
语法:for 变量名 in 条件; do …; donecode
for var in list do commands done 在list参数中,提供了迭代中要用的一系列值
思路:input
[root@xavi ~]# !vim vim sum01.sh #!/bin/bash sum=0 for i in `seq 1 100` do sum=$[ $sum+$i ] echo $i done echo $sum
#!/bin/bash cd /etc/ //脚本中若是查询的目录在多级目录下,首先要进入到目录,或者,直接跟绝对路径 for a in `ls /etc/` //遍历/etc目录 do if [ -d $a ] //一个一个的去判断是否为目录 then ls -d $a //若是是目录,就查看下目录内的文件+子目录 fi done
[root@xavi ~]# !vim vim for02.sh #!/bin/bash cd /etc/ for a in `ls /etc/` do [ -d $a ] && ls $a # 判断是不是目录,并列出其下文件和子目录 if [ -d $a ] then echo $a ls $a fi done ~
特殊for循环示例:list循环时,会以空格或回车符做为分隔符了it
[root@xavi ~]# mkdir xavi [root@xavi ~]# cd xavi/ [root@xavi xavi]# ls [root@xavi xavi]# touch 1 2 [root@xavi xavi]# touch 3\ 4.txt [root@xavi xavi]# ls 1 2 3 4.txt [root@xavi xavi]# for i in `ls ./`; do echo $i ; done 1 2 3 4.txt //把3 4.txt一个文件拆分红两个了
语法:for循环
while test command do other commands done
#!/bin/bash while : //:为死循环的意思,也至关于ture, do load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1` if [ $load -gt 10 ] then top|mail -s "load is high: $load" asd123@126.com fi sleep 30 // 负载有时候不可能一秒钟就起来了,因此每隔30秒判断一次便可。咱们使用sleep 去暂停30秒钟。而后再次执行。。。 done
把用户输入的数字输出.class
#!/bin/bash while : do read -p "Please input a number: " n if [ -z "$n" ] then echo "you need input sth." continue fi n1=`echo $n|sed 's/[0-9]//g'` if [ -n "$n1" ] // -n = ! -z ,记得加双引号 then echo "you just only input numbers." continue fi break done echo $n
[ ] continue: 当用户没有输入的时候,首先提示,而后继续让用户输入。直到输入是一个真正的数字,跳出if语句。test
示例:
#! /bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then break fi echo $i done echo aaa
执行步骤以下:
[root@xavi xavi]# sh -x break.sh ++ seq 1 5 + for i in '`seq 1 5`' + echo 1 1 + '[' 1 == 3 ']' + echo 1 1 + for i in '`seq 1 5`' + echo 2 2 + '[' 2 == 3 ']' + echo 2 2 + for i in '`seq 1 5`' + echo 3 3 + '[' 3 == 3 ']' + break + echo aaaa aaaa
也就是说,一旦遇到break就会跳出当前循环,进行下一步。
忽略continue之下的代码,直接进行下一次循环。
#! /bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then continue fi echo $i done echo aaa
执行结果以下:
1 1 2 2 3 4 4 5 5 aaa
也就是说,当执行到continue的时候,下面任何语句直接忽略。。直接进行了下一次for循环。
#! /bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then exit fi echo $i done echo aaa
执行步骤以下:
++ seq 1 5 + for i in '`seq 1 5`' + echo 1 1 + '[' 1 == 3 ']' + echo 1 1 + for i in '`seq 1 5`' + echo 2 2 + '[' 2 == 3 ']' + echo 2 2 + for i in '`seq 1 5`' + echo 3 3 + '[' 3 == 3 ']' + exit