一、for循环语法: for 变量名 in 条件;do......;doneshell
1:案例1:求1加到100的和:vim
[root@localhost_02 for]# vim for1.sh #!/bin/bash sum=0 for i in `seq 1 100` do sum=$[$sum+$i] echo $i done echo $sum
注释:首先须要给sum赋一个变量值0,进入for循环后,每循环一次,sum的值向上加一次就变化一次,一直到$i,最后输出结果$sum:bash
注释:加减法的固定格式: sum=$sum[$sum+$i]code
2:案例2:for循环文件列表,列出/etc/目录下的子目录:字符串
[root@localhost_02 for]# cat for2.sh #!/bin/bash cd /etc/ for i in `ls /etc/` do if [ -d $i ] then echo $a ls -ld $i fi done
[root@localhost_02 for]# for i in `seq 1 3`;do echo $i;done 1 2 3 [root@localhost_02 for]# for i in 1 2 3;do echo $i;done 1 2 3
注释:for循环会以回车或者空格做为分隔符:以下:input
[root@localhost_02 test]# touch 1 2 [root@localhost_02 test]# touch 3\ 4.txt [root@localhost_02 test]# ls -la -rw-r--r-- 1 root root 0 9月 26 16:45 1 -rw-r--r-- 1 root root 0 9月 26 16:45 2 -rw-r--r-- 1 root root 0 9月 26 16:45 3 4.txt [root@localhost_02 test]# for i in `ls ./`;do echo $i;done 1 2 3 4.txt
二、while循环语法:while 条件;do .......;doneit
案例1:写一个监控负载的脚本:for循环
[root@localhost_02 shell]# cat while.sh #!/bin/bash while : #冒号表示循环,此处能够用1或者true均可以; do load=`uptime|awk -F 'load average: ' '{print $2}'|cut -d . -f1` if [ $load -ge 10 ] then /usr/local/sbin/mail.py xxx@163.com "load high" "$load" fi sleep 30 #休眠30秒后,继续检测系统的负载; done [root@localhost_02 shell]# sh -x while.sh + : ++ awk -F 'load average: ' '{print $2}' ++ cut -d . -f1 ++ uptime + load=0 + '[' 0 -ge 10 ']' + sleep 30 若想这种脚本不意外的终止,能够打开screen,在screen跑脚本;
注释:class
uptime表示查看awk系统的负载,(能够用w,不过须要结合head -1使用):test
awk -F 'load average: ' '{print $2} 表示以load average为分隔符,并打印第二端:
cut -d . -f1 表示用cut命令以 . 点做为分隔符,取第一个字符:
while循环案例2:输入一个数字,若是不是数字,则一直输入,输入是数字后则正常显示:
[root@localhost_02 shell]# cat while1.sh #!/bin/bash while : do read -p "Please input number: " n if [ -z "$n" ] then echo "you need input sth" continue fi n1=`echo $n|sed s/[0-9]//g` if [ -n "$n1" ] then echo "you just only input numbers" continue fi break done echo $n [root@localhost_02 shell]# sh while1.sh Please input number: you need input sth Please input number: you need input sth Please input number: sdfs you just only input numbers Please input number: 2 2
注释:contiune 继续循环:
break:用于循环语句,直接结束全部循环:当数字等于3时,则结束全部循环:
注释:以下图例表示结束了if和for循环,而后继续打印echo内容:
[root@localhost_02 shell]# cat break.sh #!/bin/bash for i in `seq 1 5` do echo $i if [ $i -eq 3 ] #比较数字,用-eq ;如果比较的是字符串,那须要用 == then break fi echo $i done echo aaaaa 检测: [root@localhost_02 shell]# sh -x break.sh ++ seq 1 5 + for i in '`seq 1 5`' + echo 1 1 + '[' 1 -eq 3 ']' + echo 1 1 + for i in '`seq 1 5`' + echo 2 2 + '[' 2 -eq 3 ']' + echo 2 2 + for i in '`seq 1 5`' + echo 3 3 + '[' 3 -eq 3 ']' + break + echo aaaaa aaaaa [root@localhost_02 shell]# sh break.sh 1 1 2 2 3 aaaaa [root@localhost_02 shell]#
continue:结束本次循环,忽略continue下面的代码,直接进行下一次循环:
注释:以下图例表示忽略了本次continue下的代码(条件是等于3),其他代码正常运行:
[root@localhost_02 shell]# cat con.sh #!/bin/bash for i in `seq 1 5` do echo $i if [ $i -eq 3 ] then continue fi echo $i done echo bbbbb [root@localhost_02 shell]# sh con.sh 1 1 2 2 3 4 4 5 5 bbbbb
exit:退出整个脚本,用来肯定脚本运行到什么位置时结束:
注释:以下图例表示直接退出整个脚本了:
[root@localhost_02 shell]# cat exit.sh #!/bin/bash for i in `seq 1 5` do echo $i if [ $i -eq 3 ] then exit fi echo $i done echo $ccccc [root@localhost_02 shell]# sh exit.sh 1 1 2 2 3