shell脚本编程基础——循环用法

本节索引:

一、if、case条件判断

二、for、while及until循环

三、循环控制语句continue、break、shift及select菜单

四、信号捕捉trap

 

在前面的基础编程内容中,我们已经学习了shell脚本的顺序执行及选择执行,通过这两种方式,可

以帮我们解决一些简单需求,但要想在更复杂的场景中使用的话,就需要掌握循环执行的方式了。

timg_image&quality=80&size=b9999_10000&sec=1526388520&di=f2bb7e0b3f9f7570155b596

 

一、if、case条件判断

条件判断if语句:

if语句是指编程语言中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行

给出的两种操作之一。

 

格式:

if   判断条件1;then

条件1为真的分支代码

elif 判断条件2;then

条件2为真的分支代码

elif 判断条件3;then

条件3为真的分支代码

else

以上条件都不满足的分支代码

fi

 

if语句会逐条件的进行判断,当第一次遇到为“真”的条件时,就会执行其分支代码,而后结束整个if语句。

 

 

条件判断case语句:

case语句是实现选择结构程序设计的一种语句,比较适合处理离散型变量。

格式:

case 变量引用 in

1|2|3)

cmd1

;;

4|5|6)

   cmd2

;;

7|8|9)

cmd3

;;

*)

    cmd4

esac

 

注意:case支持glob风格的通配符:

如:*      表示任意长度任意字符

?    表示任意单个字符

[]      指定范围内的任意单个字符

a|b    a或者b

 

二、for、while及until循环

循环执行

将某代码段重复运行多次

重复运行多少次

次数已知

次数未知

有进入条件和退出条件

循环主要语句有:for、whlie、until

 

for循环

for语句将循环一个列表中的每一个元素执行一次循环体代码,直到列表中元素全部执行过一次。

一般用于次数预先知道的循环。

 

格式1:

for 变量名 in 列表;do

循环体

done

 

其中列表的生成方式有多种:

1.直接给出列表

2.整数列表:

(a){start..end[..step]}

(b)$(seq[start[step]end])

3.返回列表的命令:

$(COMMAND)

4.使用glob,如:*.sh

5.变量引用:

$@,$*等

执行机制:

依次将列表中的元素赋值给“变量名”,每次赋值后即执行一次循环体;直到列表中的

元素全部被执行,循环结束

 

格式2:C语言风格

for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done

Arithmetic for loop.

Equivalent to

(( EXP1 ))

while (( EXP2 )); do

COMMANDS

(( EXP3 ))

done

例:利用for循环依次读取列表{1..100}中的内容,并相加,得出1到100的数字之和

testfor

 

 

while循环

while结构循环为当型循环(when type loop),一般用于不知道循环次数的情况。维持循环的是一个条件表达式,条件成立执行循环体,条件不成立退出循环。

 

格式:

while 循环控制条件;do

         循环体

done

 

循环控制条件:进入循环之前,先做一次判断;每次循环之后会再次做判断;当条件为True时,则继续执行循环;直到条件测试状态为false时终止循环。

例:利用while循环,定义变量i=0,当i小于100时,执行循环,并让变量i每执行一次循环加1,直到i=100时停止循环,得出数字1到100之和

testwhile

 

while循环的特殊用法(遍历文件的每一行):

while read line; do

循环体

done < /PATH/FROM/SOMEFILE

依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

 

for循环与while循环的区别:

for循环与while循环是可以相互替代的;比如:

for i in {1..10};do

echo “OK”

done

用while语句来写的话:

i=1

while [ $i -le 10 ];do

echo “OK”

let i++

done

 

两者意思都是打印10次“OK”,那什么时候用for循环,什么时候又用while循环呢?

for循环用于针对集合中的每个元素的一个代码块,而while循环不断的运行,直到指定的条件不满足为止。

一般来说:

for循环比较适合循环次数确定的情况

while循环适合循环次数不确定的情况

 

 

until循环

维持循环的也是一个条件表达式,但与while用法正好相反,条件不成立时执行循环体,条件成立时退出循环。

until 循环控制条件;do

         循环体

done

 

until语句和while语句可相互转化:

如:until [ test ];do  等价于 while [ ! test ];do

 

三、循环控制语句continue、break、shift

continue语句

用于循环体中

continue[N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

格式:

while 循环控制条件;do

         CMD1

         …

         if 判断条件;then

                  continue

         fi

         CMDn

         …

done

 

例:依次打印数字1至10,当continue出现在5循环中时,直接跳过,继续执行6循环;

当continue出现在嵌套循环中时,continue 2,提前结束第二次本轮循环,并打印3次

testcontinue

 

 

 

break语句

用于循环体中

break[N]:提前结束第N层循环,最内层为第一层

while 循环控制条件;do

         CMD1

         …

         if 判断条件;then

                  break

         fi

         CMDn

         …

done

 

例:break语句将直接结束本轮循环

testbreak

 

shift命令

shift[n]:将参量列表list左移指定次数,缺省为左移一次,适合用于处理位置参数

参量列表list一旦被移动,最左端的那个参数就从列表中删除。while循环遍历位置参量列表时,

常用到shift

例1:利用shifit,每次位置变量向左移动1位,并打印本次全部位置变量,直到位置变量为0个

testdoit

例2:利用shifit,每次变量向左移动一位,并打印本次第一个位置变量,直到位置变量小于1时停止执行

testshifit

 

避免出现无限循环:

while true;do

         循环体

done

 

until false;do

         循环体

done

 

每个程序员都会偶尔不小心而编写出无限循环,在循环退出条件比较微妙时尤其如此,如果程序陷入无限循环,可按ctrl+c退出

要避免编写无限循环,务必对每个while、until循环进行测试,确保它按预期那样结束。

 

 

select循环与菜单

select 变量 in list;do

         循环体命令

done

 

select循环主要用于创建菜单,常与case语句搭配使用,用户输入菜单列表中的某个数字,执行相应的命令

select是个无限循环,因此要记住用break命令退出循环,或用户exit命令终止脚本。可按ctrl+c退出循环

与for循环类似,可以省略in list,此时使用位置变量。

相关变量:

$PS3        menu菜单提示符

$REPLY    保存用户的输入信息

 

 

四、信号捕捉trap

trap ‘触发指令’信号

自定义进程收到系统发出的指定信号好,将执行触发指令,而不会执行原操作

 

trap ” 信号

忽略信号的操作

 

trap ‘-‘ 信号

恢复原信号的操作

 

trap -p

列出自定义信号操作

 

例:打印数字1到10的过程中,trap -p显示自定义信号操作,由于trap ”int捕获了int信号,ctrl+c无法中断显示,且显示自定义输入:press ctrl+c;

打印数字11到20的过程中,由于trap ”int捕获了int信号,ctrl+c无法中断显示

打印数字21到30的过程中,trap ‘-‘恢复了原信号操作,顾ctrl+c又可中断显示

trap

trap2

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98054

(0)
李登峰李登峰
上一篇 2018-05-10
下一篇 2018-05-10

相关推荐

  • sed常用操作命令

    sed 为流编辑器,标准输出为屏幕,默认不会改动源文件 -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。-e :直接在命令列模式上进行 sed 的动作编辑;-f :直接将 sed 的动作写在一个文件内, -…

    2018-04-08
  • N31-6

    网络简介及相关命令

    Linux笔记 2018-07-29
  • Linux命令之alias

    语法,选项,参数

    Linux笔记 2018-07-22
  • boot

    把boot目录都删除了怎么办 文件的 关键 缺少 唯独缺少 grub.conf     ;创建这个文件 以上是boot下文件都删除了的补救法 下面是第二种方法 光盘启动,救援模式   ,用安装包的方式 不能安装在当前的跟下 grub-install安装grub相关信息 写 以上是boot是独立分区

    2018-05-13
  • linux基础之自动登陆和自动开启网卡设置

    Centos7.4设置自动登陆以及设置网卡开机自动启用功能 1、进入命令行模式,输入 nano /etc/gdm/custom.conf ,在[daemon]下添加2条命令,分别是 AutomaticLoginEnable=true AutomaticLogin=root 2、然后按住Ctrl+X退出并保存,接着选择Y,再按回车键即可保存更改,到这里设置自动…

    2018-03-29
  • 第六周

    简述OSI七层模型和TCP/IP五层模型应用层:为计算机用户提供应用程序接口和各种网络服务,通常可见的网络服务协议有:http,https,ftp,smtp,pop。会话层:建立、管理和终止表示层之间的通信会话。网络层:进行逻辑地址寻址,实现不同网络之间的路径选择物理层: 建立维护和断开物理连接应用层:对应OSI七层模型中的应用层、表示层、会话层网络层:物理…

    Linux笔记 2018-07-15