for 循环,while循环,break,continue,exit

一、for循环

常见的两种循环,在脚本中普遍被用到。

  • for循环
  • while循环
语法:for 变量名 in 条件; do …; done

为了更加方便的上手for循环,讲理论是不足矣理解到位的,所以我们脚本来讲。

用for循环来写个1-100的求和。
#!/bin/bash
sum=0
for i in `seq 1 100`
do
    sum=$[$sum+$i]
    echo $i
done
echo $sum

思路

  • 首先需要把1-100循环
  • 循环一次相加一次,并赋值给sum
  • 输出sum的值

seq 这个就是遍历1-100这些数字。

用for循环,遍历一个目录的目录或者文件
#!/bin/bash
cd /etc/            //脚本中如果查询的目录在多级目录下,首先要进入到目录,或者,直接跟绝对路径
for a in `ls /etc/`     //遍历/etc目录
do
    if [ -d $a ]        //一个一个的去判断是否为目录
    then
    ls -d $a    //如果是目录,就查看下目录内的文件+子目录
    fi
done

二、while循环

语法

while 条件; 

do … ;

done
用while do写一个死循环。

如果说写个脚本去监控系统的负载,我认为while语句最适合不过。

思路:

  • 脚本一定要在后台去监控并执行
  • 如何得到负载值
  • 发现超过负载需要发邮件
#!/bin/bash
while :         //:为死循环的意思
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" [email protected]
fi
sleep 30
done

如上把系统负载赋值到load中,然后针对load做判断。 awk, sed,cut 就是之前所讲的shell基础知识(也就是想方设法的搞到负载值,然后再去判断),最后的mail就是用来发邮件的。

负载有时候不可能一秒钟就起来了,所以每隔30秒判断一次即可。我们使用sleep 去暂停30秒钟。然后再次执行。。。

当然这种脚本如何让它在后台运行坚持呢? 在一个新的screen执行即可。

第二个案例:

通过和用户的交互得到一个值,并判断。

把用户输入的数字输出.

  • 首先判断,如果用户没有输入怎么办?
  • 用户输入的不是纯数字怎么办?
  • 根据用户输入的数字,并输出。
#!/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

continue: 当用户没有输入的时候,首先提示,然后继续让用户输入。直到输入是一个真正的数字,跳出if语句。

break:如果是一个真正的数字,则跳出整个while语句。


break 的用法:

用一个小脚本来解释 break 的用法:

#! /bin/bash

for i in `seq 1 5`
do 
	echo $i
if [ $i == 3 ]
then
	break
fi
echo $i
done
echo aaa

执行步骤如下:

[[email protected]-01 sbin]# 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 aaa
aaa

也就是说,一旦遇到break就会跳出当前循环,进行下一步、


continue 的用法:

忽略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循环。


exit 退出整个脚本

#! /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

当直行到3的时候,直接就退出脚本 。


总结:

continue:仅仅 结束 本次循环

break:结束 整个循环

exit:退出 整个脚本

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏好好学java的技术栈

「附数据结构资源」玩转java并发(六):深入线程Thread类的start()方法和run()方法

java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都...

1072
来自专栏python 实践经验

python 语法基础之字符集编码

Python初学者编码实践中经常遇到encode error,decode error。

4545
来自专栏java 成神之路

JVM 类加载机制深入浅出

26911
来自专栏noteless

-1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),

java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法...

1124
来自专栏决胜机器学习

PHP开发过程的那些坑(二) ——PHP empty函数

PHP开发过程的那些坑(二)——PHP empty函数 (原创内容,转载请注明来源,谢谢) 坑: 在工作过程中,常用empty()函数判断数组是否为空,为空时返...

3838
来自专栏武军超python专栏

2018年7月23日数据存储到文件中的代码介绍:

******************************************************************

1055
来自专栏desperate633

第7课 创建计算字段拼接字段执行简单的算术运算

什么是计算字段? 就是直接从数据库中检索出转换,计算或者格式化的数据,而不是检索出数据之后,再在客户端应用程序中重新格式化。

732
来自专栏电光石火

获取URL地址中的GET参数

/*-----------------实现1--------------------*/ function getPar(par){ //获取当前URL...

2489
来自专栏杨建荣的学习笔记

Python基础之os和数据结构

今天总结了下Python的基础,发现还是有很多基础需要巩固,直接把学习的内容放上来。 >>> import os 得到当前的所在的路径 >>> os.getcw...

3566
来自专栏mwangblog

python模块

1543

扫码关注云+社区

领取腾讯云代金券