bash脚本编程class2

bash脚本class2—循环语句的使用

     一.三种循环语句以及其具体使用方法

  我们知道,在shell脚本编程过程中,为了实现逻辑关系的运算,有三种执行命令的顺序:顺序执行,选择执行,循环执行。通过if,case这类语句可以实现条件筛选后执行命令,这次课程中所学的主要知识点为循环语句的三种使用方式:for,while,until。下面作为总结,我将一一介绍这三种使用方法。

  1.for语句的使用方法

  for语句的格式是这样的:

  for 变量 in 变量列表;do 循环命令  done

  变量就是所要执行变量的参数,这些参数是由我们定义在in后面的变量列表中,按照变量列表中的所有参数顺序一次一次的执行循环命令,直到列表中的参数使用完。举例如下:

[root@localhost ~]# for x in {1..10};do echo  $[x+1];done
2
3
4
5
6
7
8
9
10
11

 这段命令就是一段for循环语句,显示变量1-10分别加1得到的所有值

  for语句还有更为简洁的写法,与c语言逻辑语句相似,for((cmd1;cmd2;cmd3)) ;do 循环语句 ;done。其中cmd1为变量初始设定,cmd2为变量判断,cmd3为变量值更改,举个例子:

   打印99乘法表: 

#!/bin/bash
for ((x=1;x<=9;x++));do
    for ((y=1;y<=x;y++));do
        echo -ne "$x*$y=`echo $[x*y]'\t'`"
    done
    echo ""
done

  执行得到结果

[root@localhost ~]# bash 99for.sh
1*1=1	
2*1=2	2*2=4	
3*1=3	3*2=6	3*3=9	
4*1=4	4*2=8	4*3=12	4*4=16	
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81	

  2.while与until的循环使用方法

  while与until循环的语句写法是一样的,不同的是判断执行循环的条件不同。while 判断 ;do 循环体;done。表示当条件判断为真时,执行循环体,相反until 判断 ;do 循环体;done表示当条件判断为假时,执行循环体。举例如下:

#!/bin/bash
k=0
i=1
while [[ $i -le 100 ]] ;do
    let  k=$k+$i
    let i=$i+1
done
   echo $k

  效果等同于

#!/bin/bash
k=0
i=1
until [[ $i -gt 100 ]] ;do
    let  k=$k+$i
    let i=$i+1
done
   echo $k

  执行这两个脚本后,得到的结果相同,为1+2..+10=5050。

  由于这两个执行指令相似,所以使用while进行统一归类实例。while与until可以制作死循环语句,如下写法:

  while ture ;do 循环体 ;done

  until false ;do 循环体 ;done

  while还有一种特殊使用方法,使用重定向,将文件每一行内容作为变量,使用read逐行扫描并执行循环体。效果如同sed命令。举例如下:

  将/etc/passwd文件的每一行首字符打印出来:

#!/bin/bash
while read xxx ; do
   echo `echo $xxx | cut -c 1`
done < /etc/passwd

[root@localhost bin]# bash 000001.sh
r
b
d
a
l
s
s
h
m
o
g
f
n
s
...

  3.break和continue

  break与continue用法相似,代表意义不同。这两个指令使用在循环语句中,后面可以接数字表示第N层循环,不加或者1表示当前循环。continue表示退出这一次循环,执行下一个参数的循环。而break表示退出当前的循环。在while与until中很常见。比如:

#!/bin/bash
for ((i=1;i<=10;i++));do
    if [ $i -eq 2 -o $i -eq 4 ];then
        continue
    fi
    echo $i
done

[root@localhost bin]# bash 000000.sh 
1
3
5
6
7
8
9
10

  这个语句本来表示显示从1到10,但是在循环中if判定条件中当i=2或4的时候选择执行continue,所以下面的echo $i就被跳过执行了。

  

    二.select语句以及与case语句的联合使用方式

  select语句是一个死循环命令语句,想要跳出需要使用条件判定和break。命令格式为:select 变量 in 变量列表 ;do 循环体 ;done。select命令创建一个菜单,当我们输入编号时,按照编号打印相应的变量。如下所示:

#!/bin/bash
echo "who is bitch?"
select xxx in laowang laosong marong;do
    echo $xxx
    if [[ $xxx == marong ]];then
    echo "Sure,you are right!!"
    break
    else
    echo "SB Think more!"
    fi
done

[root@localhost bin]# bash 000002.sh
who is bitch?
1) laowang
2) laosong
3) marong
#? 1
laowang
SB Think more!
#? 2
laosong
SB Think more!
#? 3
marong
Sure,you are right!!

  执行后如上所示。marong是bitch。下面看select与case的合作:

#!/bin/bash
echo "who is bitch?"
select xxx in laowang laosong marong;do
    case $xxx in
laowang)
    echo "wrong!"
;;
laosong)
    echo "you almost right,but he is a man"
;;
marong)
    echo "Sure! she is so bitch!!"
    break
    esac
done

[root@localhost bin]# bash 000002.sh
who is bitch?
1) laowang
2) laosong
3) marong
#? 1
wrong!
#? 2
you almost right,but he is a man
#? 3
Sure! she is so bitch!!

 

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

(0)
mcgeewangmcgeewang
上一篇 2016-08-19 08:36
下一篇 2016-08-19 08:36

相关推荐

  • cp和ln命令简述

    cp和软ln命令简述 cp          备注: 1.       该命令可以自动判断你所复制的是文件还是目录 2.       当源是一个文件,目标(目的…

    2017-08-19
  • N28-第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。
    2、取出最后登录到当前系统的用户的相关信息。
    3、取出当前系统上被用户当作其默认shell的最多的那个shell。
    4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。
    5、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
    6、列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中。
    7、显示/var目录下一级子目录或文件的总个数。
    8、取出/etc/group文件中第三个字段数值最小的10个组的名字。
    9、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。
    10、请总结描述用户和组管理类命令的使用方法并完成以下练习:
    (1)、创建组distro,其GID为2016;
    (2)、创建用户mandriva, 其ID号为1005;基本组为distro;
    (3)、创建用户mageia,其ID号为1100,家目录为/home/linux;
    (4)、给用户mageia添加密码,密码为mageedu;
    (5)、删除mandriva,但保留其家目录;
    (6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
    (7)、修改slackware的默认shell为/bin/tcsh;
    (8)、为用户slackware新增附加组admins;

    2017-12-17
  • lamp安装配置详细过程(把以前的笔记贴上来)

    准备; 首先进入/usr/local/目录 #cd /usr/local 删除所有安装过的php mysql apache 以及libxml 首先查看目前 /usr/local目录下面的内容 #ls –l 如果看到php5 php apache2 apache mysql mysql5 libxml libxml2字样的目录都将其删除具体命令如下 #rm –…

    Linux干货 2015-05-01
  • NET25-第7周作业

    1、创建一个10G分区,并格式为ext4文件系统; (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl; [root@node1 ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI o…

    Linux干货 2017-03-15
  • 一起学DHCP系列(五)指派、获取

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jeffyyko.blog.51cto.com/28563/163168     本节将主要讲述DHCP客户端获取IP的过程,也是此系列中非常重要的一节。   &…

    Linux干货 2015-03-25
  • iptables介绍和使用

    iptables/netfilter:    Packets Filter Firewall:          包过滤型防火墙:  Firewall:隔离工具,工作于主机或网络的边缘处,对经由的报文根据预先定义的规则(识别标准)进行检测,对于能够被规则匹配到的报文实行…

    Linux干货 2017-04-29

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 09:12

    文章思路很清晰,对for,until,while语句的语法总结的很全面,同时通过示例演示了until和while之间的区别,很好,再接再励哦