Shell脚本编程 流程控制—循环

循环:重复执行所指定的代码片段,直到循环条件不满足,则退出循环

一、for循环

    语法格式:

    for 变量名 in 列表

    do

        循环体

    done

    for循环运行格式,依次将列表中的元素赋值给变量名,而后执行一次循环体,直到列表中的元素耗尽 则退出循环

    列表的生成:

        1.直接给出列表

        2.整数列表:seq 1 n或{1..100}

        3.命令引用

        4.变量引用

[root@CentOS6 ~]# cat for.sh 
#!/bin/bash
#
for I in {1..10}
do
echo $I
done
[root@CentOS6 ~]# bash for.sh 
1
2
3
4
5
6
7
8
9
10
[root@CentOS6 ~]#

for特殊用法:

    for ((控制变量初始值;条件判断表达式;修正表达式))

    do

        循环体

    done

    循环之前判断条件表达式是否成立,如果成立,则执行一次循环体,然后执行修正表达式做修正,再吃判断条件表达式是否成,成立则循环,否则退出

    

[root@CentOS6 ~]# cat for.sh 
#!/bin/bash
#
for ((I=1;I<=10;I++))
do
echo $I
done
[root@CentOS6 ~]# bash for.sh 
1
2
3
4
5
6
7
8
9
10
[root@CentOS6 ~]#

for创建死循环:

    for ((;1;))

    do

      echo "hello"

    done

    无限输出hello,按Ctrl+c退出循环

    

二、while循环

    语法格式:

    while CONDITION

    do    

        循环体

    done

    在做循环之前CONDITION是否成立,如果条件成立,执行一次循环体,直到条件不满足为止,因此,在循环体中我们一般会对CONDITION做修正

    进入条件:CONDITION为true

    退出条件:CONDITION为false

[root@CentOS6 ~]# cat while1.sh 
#!/bin/bash
#
declare -i I=1
while [ $I -le 10 ]
do
echo $I
let I++
done
[root@CentOS6 ~]# bash while1.sh 
1
2
3
4
5
6
7
8
9
10
[root@CentOS6 ~]#

    while特殊用法:

    while read 变量名

    do   

        循环体

    done < /PATH/TO/SOMEFILE

    依次读取SOMEFILE文件中的每一行,并赋值给所指定的变量,而后执行循环体

    我们在处理文本文件时经常会用到这种格式

    

[root@CentOS6 ~]# cat whilefile.sh     显示/root/for.sh文件中的每一行
#!/bin/bash
#
while read LINE
do
echo $LINE
done < /root/for.sh
[root@CentOS6 ~]# bash whilefile.sh 
#!/bin/bash
#
for ((;1;))
do
echo "hello"
done
[root@CentOS6 ~]#

    while死循环:

    while true

    do

        循环体

    done

    条件测试语句永久为真,循环体将永久执行,按Ctrl+c退出循环

三、until循环

    语法格式:

    until CONDITION

    do

        循环体

    done

    循环之前判断CONDITION是否为假,如果为假,执行一次循环体,直至CONDITION为真结束循环

    进入条件:CONDITION为假

    退出条件:CONDITION为真

    

[root@CentOS6 ~]# cat until.sh     #打印1到10之间的整数
#!/bin/bash
#
declare -i I=1

until [ $I -gt 10 ]
do
    echo $I
    let I++
done
[root@CentOS6 ~]# bash until.sh 
1
2
3
4
5
6
7
8
9
10
[root@CentOS6 ~]#

    until创建死循环

    until false

    do

        循环体

    done

    CONDITION条件永久为假,循环体永久执行,按Ctrl+c停止循环

循环控制语句:

    continue:当满足一定条件时,提前结束第N层的循环,而直接进入下一次循环判断

    break:当满足一定条件时,提前结束第N层循环

下面我们来做几个示例:

1.添加user1-user10是个用户密码同用户名

[root@CentOS6 ~]# cat user.sh 
#!/bin/bash
#
for I in $(seq 1 10)
do
    if ! id user$I &> /dev/null;then
        useradd user$I
        echo user$I:user$I | chpasswd
        echo "Add user$I finishd."
    else
        echo "user$I exists."
    fi
done
[root@CentOS6 ~]# bash user.sh     #添加10个用户完成
Add user1 finishd.
Add user2 finishd.
Add user3 finishd.
Add user4 finishd.
Add user5 finishd.
Add user6 finishd.
Add user7 finishd.
Add user8 finishd.
Add user9 finishd.
Add user10 finishd.
[root@CentOS6 ~]# bash user.sh     #如果用户已添加,则显示用户已经存在
user1 exists.
user2 exists.
user3 exists.
user4 exists.
user5 exists.
user6 exists.
user7 exists.
user8 exists.
user9 exists.
user10 exists.
[root@CentOS6 ~]#

2.编写脚本,测试10.1.252.1-254所有主机在线状态

[root@CentOS6 ~]# cat ip.sh 
#!/bin/bash
#

echo "测试10.1.252.1-254所有主机在线状态"
NETWORK="10.1.252."
Red="\033[31m"
Green="\033[32m"
End="\033[0m"
declare -i UP=0
declare -i DOWN=0
for I in $(echo ${NETWORK}{1..254})
do
    if ping -c 1 -W 1 $I &> /dev/null;then
        echo -e "${Green}$I IP is up.$End"
        echo $I >> /root/up.txt
        let UP++
    else
        echo -e "${Red}$I IP is down.$End"
        echo $I >> /root/down.txt
        let DOWN++
    fi
done
echo "host up is $UP."
echo "host down is $DOWN."
[root@CentOS6 ~]# 
[root@CentOS6 ~]# bash ip.sh 
测试10.1.252.1-254所有主机在线状态
10.1.252.1 IP is down.
10.1.252.2 IP is down.
10.1.252.3 IP is down.
10.1.252.4 IP is down.
10.1.252.5 IP is down.
10.1.252.6 IP is down.
10.1.252.7 IP is up.
10.1.252.8 IP is down.
...

3.打印99乘法表

[root@CentOS6 ~]# cat 99.sh 
#!/bin/bash
#

for I in $(seq 1 9)
do
	for J in $(seq 1 $I)
	do
		echo -n -e "${J}X${I}=$[${J}*${I}]\t"
	done
	echo
done
[root@CentOS6 ~]# bash 99.sh 
1X1=1	
1X2=2	2X2=4	
1X3=3	2X3=6	3X3=9	
1X4=4	2X4=8	3X4=12	4X4=16	
1X5=5	2X5=10	3X5=15	4X5=20	5X5=25	
1X6=6	2X6=12	3X6=18	4X6=24	5X6=30	6X6=36	
1X7=7	2X7=14	3X7=21	4X7=28	5X7=35	6X7=42	7X7=49	
1X8=8	2X8=16	3X8=24	4X8=32	5X8=40	6X8=48	7X8=56	8X8=64	
1X9=9	2X9=18	3X9=27	4X9=36	5X9=45	6X9=54	7X9=63	8X9=72	9X9=81	
[root@CentOS6 ~]#

4.打印nn金字塔

[root@CentOS7 bin]# cat jinzita.sh 
#!/bin/bash
#

read -p "请输入要打印的行数:" INT

for ((LINES=1;LINES<=INT;LINES++))
do
	for ((Space=0;Space<=$[$INT-$LINES];Space++))
	do
		echo -n " "
	done

	for ((Xing=1;Xing<=$[$LINES*2-1];Xing++))
	do
		echo -n -e "\033[31m*\033[0m"
	done
	echo
done
[root@CentOS7 bin]# bash jinzita.sh 
请输入要打印的行数:10
          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
[root@CentOS7 bin]#

原创文章,作者:zhai796898,如若转载,请注明出处:http://www.178linux.com/39519

(0)
zhai796898zhai796898
上一篇 2016-08-24 11:20
下一篇 2016-08-24 19:02

相关推荐

  • 逻辑卷管理

    逻辑卷管理 一 创建逻辑卷 1 准备分区或硬盘 这里使用/dev/sdb、/dev/sdc两块硬盘和/dev/sda9、/dev/sda10两个分区,大小都为1G,磁盘有限,我也不想这么抠的。 添加分区/dev/sda9、 /dev/sda10 [root@centos7 ~]# fdisk /dev/sda Welcome to fdisk (u…

    Linux干货 2017-05-02
  • linux存储系统流程简介

    存储系统是linux系统非常重要,也是非常基础的知识点。整个存储系统涉及到知识点也非常的多。 本文主要通过磁盘简介->分区管理->文件系统管理->文件存储结构->软连接和硬链接->挂载原理->常见存储相关操作命令,这一条主线来让大家对linux的整个存储系统有个初步,清晰的了解. 1.磁盘简介   &n…

    Linux干货 2015-12-15
  • Docker之~集群配置

    一、前言 Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件,目前最新版本为0.6.2。 本文介绍如何基于Centos7.0构建Kubernetes平台,在正式介绍之前,大家有必要先理解Kubernetes几个核心概念及其承担的功能。以下为Kubernet…

    2015-03-23
  • Linux 基础(6)—— 权限

    修改所属人,所属组                文件的 r w x 权限            修改文件的权限chmod          umask &nb…

    2017-07-27
  • rsyslog基于mysql的日志集中存储,及loganalyzer日志分析工具的web配置

    Rsyslog是Linux系统自带的一款强大的日志系统,在业务量不是很大的情况下,能够满足大部分客户的日志分类搜集功能,是广大运维同事进行系统监控、分析不可或缺的利器。而在运维自动化高速发展的今天,如果我们还要“人工”智能的去每一个服务器上查看系统日志就显得太LOW了,并且,对我们来说也是一个不小的负担。 基于此,我们就简单的来介绍一下,rsyslog结合m…

    系统运维 2017-02-05
  • linux中软链接和硬链接简单说明

    linux链接文件 在 Linux 上文件系统被分成两个部分:数据 (user data) 与元数据 (metadata)。数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如:文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含…

    Linux干货 2016-12-05