Shell循环的那些事儿—从循环开始入门shell脚本语言

这里笔者列举一下shell中的循环操作,各位看可以结合自己以前学习的基础编程语言,看出一些心得,方便入门shell语言

1.列表for循环

首先来看shell中循环的基本格式

forvariablein{list}

do

command

command

command

......

done

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

foriin{123}

do

echo"$i"

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

{1

2

3}

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

foriin123

do

echo"$i"

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

1

2

3

################################################################

这里看到,在循环中,shell只是把list的字符串都走了一遍,在第一段代码里面,将“{1”与“3}”认为是一个字符串,并没有识别成括号。所以,使用的时候这个是需要注意的。

列表for循环的第二种形式:略写计数

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

foriin{1..3}

do

echo"$i"

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

1

2

3

################################################################

简单的对list代码段做了修改,只是表示一下shell支持略写计数。

列表for循环的第三种形式:跳跃for循环

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

sum=0

foriin$(seq12100)

do

let"sum+=i"

done

echo"$sum"

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

2500

################################################################

备注:关于seq,它是Linux中一个预设的外部命令,一般用作一堆数字的简化写法。

For循环显示当前目录下所有文件

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

sum=0

foriin$(ls)

do

echo"file:$i"

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

file:case1.php

file:case.sh

file:control

file:hadoop

file:help_hadoop.txt

file:jdk.tar

file:output.awk

file:QA

################################################################

简单的利用ls命令可以被shell脚本识别,将ls的输出作为for循环的输入

最后一种关于带列表的for循环的用法,通过命令行来实现传入参数

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

echo"numberofargumentsis$#"

echo"inputis"

forargumentin"$*"

do

echo"$argument"

done

[zhangyongqiao.pt@v128217:~$]./sorttest.shabc

numberofargumentsis3

inputis

abc

################################################################

利用系统变量$#$*实现传入参数

注意:列表参数传入可以是字符串也可以是数字,但是都以空格分隔,所以在写入的时候需要注意参数间的空格。

2.不带列表for循环

简单的,不带列表的for循环就是将for循环的列表{list}部分去掉

那么最后形成如下的格式:

forvariable

do

command

command

...

done

根据上面的最后一个例子做变形即可得到:

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

echo"numberofargumentsis$#"

echo"inputis"

forargument

do

echo"$argument"

done

[zhangyongqiao.pt@v128217:~$]./sorttest.shabc

numberofargumentsis3

inputis

a

b

c

################################################################

3.类c风格的for循环

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

for((i=0;i<2;i++))

do

echo"$i"

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

0

1

################################################################

有爱的代码,一看就懂,唯一需要注意的是,要加2对括号,这样做里面可以执行C风格的变量操作,还有些数字的处理之类的。

While循环

最简单的类c风格while循环如下:

while expression

do

command

command

...

done

加入计数器控制循环跳出

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

count=1

while(($count<3))

do

echo"$count"

let"count++"

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

1

2

################################################################

结束标记控制的while循环

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

echo"inputanumber:"

readnum

while[["$num"!=4]]

do

if["$num"-lt4]

then

echo"tosmall.redo"

readnum

elif["$num"-gt4]

then

echo"tohigh.redo"

readnum

else

exit0

fi

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

inputanumber:

3

tosmall.redo

5

tohigh.redo

4

################################################################

注意:这里编码的时候需要注意的一点就是shell的命令对空格的敏感度问题,在命令(whileifecho等等)后一般都需要空格隔开,便于shell本身对其的解释。

这里还有一种控制标记的while循环大致代码如下:

################################################################

...

sign=0

while[["$sign"==0]]

...

else

sign=1

fi

done

...

################################################################

仅仅是做了一个标记值来控制循环跳出,这里就不多做解释了。

命令行控制的while循环

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

while[["$*"!=""]]

do

echo"$1"

shift

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh123

1

2

3

################################################################

while循环经常结合shift来使用,shift命令使位置变量下移一位。

当然,这里的循环控制条件也可以使用while[["$#"-ne0]]来实现

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

while[["$#"-ne0]]

do

echo"$1$#"

shift

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh123

13

22

31

################################################################

在这个地方,便于理解,可以把$*看做是一个队列,而$#就是这个队列的长度了。

Until循环

Until循环与while类似,无非是while循环语义为当满足循环条件时执行,而until循环的语义是当满足循环条件的时候退出。

简单的一个until例子足以说明问题

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

until[["$i"-gt3]]

do

let"squ=i*i"

echo"$squ"

let"i++"

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

0

1

4

9

################################################################

最后是一组嵌套循环,也是简单的例子。99乘法表

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

for((i=1;i<=9;i++))

do

for((j=1;j<=i;j++))

do

let"total=i*j"

echo-n"$i*$j=$total"

done

echo""

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

1*1=1

2*1=22*2=4

3*1=33*2=63*3=9

4*1=44*2=84*3=124*4=16

5*1=55*2=105*3=155*4=205*5=25

6*1=66*2=126*3=186*4=246*5=306*6=36

7*1=77*2=147*3=217*4=287*5=357*6=427*7=49

8*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64

9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81

################################################################

while循环也是如此,利用类似方法可以实现,这里就不多做示范了。

Break循环控制符

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

for((i=1;i<=9;i++))

do

for((j=1;j<=i;j++))

do

let"total=i*j"

echo-n"$i*$j=$total"

done

echo""

if["$i"-gt5]

then

break

fi

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

1*1=1

2*1=22*2=4

3*1=33*2=63*3=9

4*1=44*2=84*3=124*4=16

5*1=55*2=105*3=155*4=205*5=25

6*1=66*2=126*3=186*4=246*5=306*6=36

################################################################

continue循环控制符的使用方式

当遇到continue时,跳过本次循环,执行下一次循环,下面的例子就是当i=5时,跳过循环,直接执行i=6时的循环。

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

for((i=1;i<=9;i++))

do

if["$i"-eq5]

then

continue

fi

for((j=1;j<=i;j++))

do

let"total=i*j"

echo-n"$i*$j=$total"

done

echo""

done

[zhangyongqiao.pt@v128217:~$]./sorttest.sh

1*1=1

2*1=22*2=4

3*1=33*2=63*3=9

4*1=44*2=84*3=124*4=16

6*1=66*2=126*3=186*4=246*5=306*6=36

7*1=77*2=147*3=217*4=287*5=357*6=427*7=49

8*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64

9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81

################################################################

select的结构

基本结构

selectvariablein{list}

do

command

command

...
break

done

Select相当于swich-case结构,他是bash的扩展结构,从技术角度将不算是循环结构,因为其不对可执行结构的代码进行循环操作,但其与循环结构有相似之处,他们也依靠代码块的顶部或者底部的条件判断来决定程序分支。

################################################################

[zhangyongqiao.pt@v128217:~$]catsorttest.sh

#!/bin/bash

echo"选择颜色:"

selectcolor

do

break

done

echo$color

[zhangyongqiao.pt@v128217:~$]./sorttest.sh黄红蓝

选择颜色:

1)黄

2)红

3)蓝

#?2

################################################################

关于循环的小结:

主要循环分为while循环,for循环属于“当型循环”,也就是“当。。。时,执行操作”,

until属于“直到型循环”,也就是“直到。。。时,执行操作”。关于循环操作在其他编程语言中已经说的非常清楚了。

这里无非是利用循环这个应用比较普遍的语法结构,便于对shell的语法结构做入门。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值