版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

for循环

语法:for 变量名 in 条件; do …; done案例11+2+3..+100的和sum 第一次作为变量的时候,是0;当进入for循环里面的时候,每运算一次,sum变量就会改变一次,直至$i 结束;最后输出结果 $sum在做加减法的时候,[ ] 方括号里面不需要加空格#!/bin/bash sum=0 for i in `seq 1 100` #seq 1到100个数字 do sum=$[$sum+$i] echo $i done echo $sumfor循环案例2文件列表循环列出所有 etc目录下的子目录#!/bin/bash cd /etc/ for a in `ls /etc/` do if [ -d $a ] then ls -d $a fi done[root@123 shell]# for a in `seq 1 3`; do echo $a; done 1 2 3 [root@123 shell]# for a in 1 2 3; do echo $a; done 1 2 3 [root@123 shell]#for 循环的时候会以 空格 或者 回车做为分隔符

while循环

语法 while 条件; do … ; done案例1每隔1分钟检查一下系统负载,当系统的负载大于10的时候,发一封邮件(监控脚本)最小单元是任务计划 cron#!/bin/bash while : # 冒号 : 表示死循环的意思,或者1,或者 true都是死循环 do load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1` if [ $load -gt 10 ] then /usr/local/sbin/mail.py xxx@163.com "load high" "$load" fi sleep 30 #休眠30秒,因为检查系统负载,不需要一直去检查,过一会再看 done [root@123 shell]# sh -x while1.sh + : ++ w ++ head -1 ++ awk -F 'load average: ' '{print $2}' ++ cut -d. -f1 + load=0 + '[' 0 -gt 10 ']' + sleep 30 若想这种脚本不意外的终止,可以打开screen,在screen跑脚本
知识点
w //查看系统负载 ;uptime 可以直接显示 w 系统负载的第一行,就可以省去 head -1head -1 //取第一行awk -F 'load average: ' '{print $2}' // 以'load average: '分隔,输出第二段cut -d . -f1 // 以.分隔 取第一段
while循环案例2
在循环过程过,需要用户输入一个数字;输入的不是数字,是数字,输入为空;回应相应的结果#!/bin/bash while : do read -p "Please input a number: " n if [ -z "$n" ] then echo "you need input sth." continue #continue 重新回到循环 fi n1=`echo $n|sed 's/[0-9]//g'` if [ -n "$n1" ] then echo "you just only input numbers." continue fi break #break 退出循环 done echo $n

break跳出循环

break 常用于循环语句中跳出整个循环语句,直接结束所有循环#!/bin/bash for i in `seq 1 5` do echo $i if [ $i -eq 3 ] #比较数字,用-eq ;若是比较的是字符串,那需要用 == then break fi echo $i done echo aaaaaaa[root@123 shell]# sh -x berak.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 hahaha hahaha [root@123 shell]# sh berak.sh 1 1 2 2 3 hahaha [root@123 shell]#

continue结束本次循环

忽略continue之下的代码,直接进行下一次循环#!/bin/bash for i in `seq 1 5` do echo $i if [ $i -eq 3 ] then continue fi echo $i done echo $i[root@123 shell]# sh continue.sh 1 1 2 2 3 4 4 5 5 hahaha [root@123 shell]#

exit退出整个脚本

exit直接结束退出整个脚本可以定义退出的数值,可以用于确定脚本运行到什么地方的时候,结束#!/bin/bash for i in `seq 1 5` do echo $i if [ $i -eq 3 ] then exit fi echo $i done echo aaaaaaa[root@123 shell]# sh exit.sh 1 1 2 2 3 [root@123 shell]#
扩展
select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html