20.10 for循环
20.11/20.12 while循环
20.13 break跳出循环
20.14 continue结束本次循环
20.15 exit退出整个脚本
扩展
select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html
20.10 for循环:
for循环会以空格或回车作为一个分隔符来遍历的。如果for循环一个文件的话,文件名含有空格,他会认为这个两个文件
~1.语法:for 变量名 in 条件; do …; done
~2.for循环案例1(需求:计算1-100所有数字的和)
#!/bin/bash
sum=0 #首先赋予sum的值等于0,稍后引用这个sum
for i in `seq 1 100` #for循环出1-100的数字
do #然后做什么?
sum=$[$sum+$i] #赋予这个sum的变量,等于0+1到100。也就是利用上面那个sum赋予这个sum相加的动作
echo $i #显示出1到100这个循环。不加上的话,直接显示相加的总数字
done #结束
echo $sum #最后显示$sum这个变量
~3.for循环案例2(需求:把etc目录做遍历。把etc目录下的子目录全部列一下)
文件列表循环
#!/bin/bash
cd /etc/
for a in `ls /etc/`
do
if [ -d $a ]
then
ls -d $a #列出etc下的子目录。并不包括子子目录
fi
done
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.11/20.12 while循环:
~1.语法 while 条件; do … ; done
~2.案例1(需求:每个半分钟检查系统的负载,当负载大于10的时候就发一封邮件)
#!/bin/bash
while : #冒号为死循环。也可以写成true(真)。一样的效果
do
load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1` #把load赋值
w为 查看系统负载的
head -1为 查看他的第一行
awk -F 'load average: ' '{print $2}' 为以load average作为分隔符。并打印这一行的第二段。注意,以load average作为分隔符的时候后面可以加上一个空格,因为出来的负载值前面有个空格,要把这个空格消掉
cut -d. -f1 为以点为分隔,截取第一段
就达到了我们w查看1分钟之内的系统负载
if [ $load -gt 10 ] #当他大于10的时候
then #然后发邮件
/usr/lib/zabbix/alertscripts/mail.py "load is high: $load" asldkfls@11.com
#我们用之前zabbix上写的mail.py来发送邮件
#双引号里面的是主题
#后面的是发送给谁
fi
sleep 30 #30秒查一次
done
~3.案例2(需求:也是一个死循环。要求与人有交互,当输入空格的时候怎么样,输入数字的时候怎么样)也个就是让用户不停地输入数字的一个脚本。用到了continue、break
#!/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" ] #如果数字不为空。也就代表有特殊字符或字母
then
echo "you just only input numbers."
continue #继续以上这两个循环开始
fi
break #跳出这个脚本的循环(满足以上俩个条件后,跳出循环)
done
echo $n #最终显示$n(输入的打印出来)
!!小知识点,当写脚本的需要中文的时候,出现乱码,可能是没有设置中文的UTF8。LANG=zh_CN.UTF8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.13 break跳出循环:
break用在循环里,for也行,while也可以
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i == 3 ] #如果截取的是字符串就要用==(比如单词),数字的话用-eq
#也就是当$i等于3的时候,就不显示了。因为下面跳出这个循环了
then
break
fi
echo $i
done
echo aaaaaaa
[root@axinlinux-01 shell]# sh break1.sh #跳出循环并没有显示4 5
1
1
2
2
3
aaaaaaa
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.14 continue结束本次循环:
~1.忽略continue之下的代码,直接进行下一次循环
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i == 3 ]
then
continue
fi
echo $i
done
echo $i
[root@axinlinux-01 shell]# sh continue
1
1
2
2
3 #在if [$i == 3 ]的时候就直接结束这次循环。继续执行下面的循环。跟break不同,break是直接跳出了,结束了
4
4
5
5
aaaaaaa
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.15 exit退出整个脚本:
~1.直接退出整个脚本,下面的所有不执行
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i == 3 ]
then
exit 2 #这里可以定义exit的数字,也就是我们echo $?时的值
fi
echo $i
done
echo aaaaaaa
[root@axinlinux-01 shell]# sh exit.sh
1
1
2
2
3
[root@axinlinux-01 shell]# echo $?
2
总结:
continue 结束本次循环
break 结束整个循环
exit 退出整个脚本