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

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

1.列表for循环

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

for variable in {list}

do 

command

command

command

......

done

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

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

#!/bin/bash

  for i in {1 2 3}

  do

    echo "$i"

  done

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

{1

2

3}

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

#!/bin/bash

  for i in 1 2 3

  do

    echo "$i"

  done

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

1

2

3

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

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

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

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

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

#!/bin/bash

  for i in {1..3}

  do

    echo "$i"

  done

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

1

2

3

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

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

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

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

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

#!/bin/bash

  sum=0

  for i in $( seq 1 2 100)

  do

    let "sum+=i"

  done

  echo "$sum"

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

2500

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

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

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

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

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

#!/bin/bash

  sum=0

  for i in $(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:~$] cat sorttest.sh

#!/bin/bash

echo "number of arguments is $#"

echo "input is "

for argument in "$*"

do

  echo "$argument"

done

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

number of arguments is 3

input is

a b c

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

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

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

2.不带列表for循环

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

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

for variable

do

command

command

...

done

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

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

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

#!/bin/bash

echo "number of arguments is $#"

echo "input is "

for argument

do

  echo "$argument"

done

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

number of arguments is 3

input is

a

b

c

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

3.类c风格的for循环

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

[zhangyongqiao.pt@v128217:~$] cat sorttest.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:~$] cat sorttest.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:~$] cat sorttest.sh

#!/bin/bash

echo "input a number:"

read num

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

do

  if [ "$num" -lt 4 ]

  then

    echo "to small.redo"

    read num

  elif [ "$num" -gt 4 ]

  then

    echo "to high.redo"

    read num

  else

    exit 0

  fi

done

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

input a number:

3

to small.redo

5

to high.redo

4

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

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

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

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

...

sign=0

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

...

  else

    sign=1

  fi

done

...

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

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

命令行控制的while循环

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

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

#!/bin/bash

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

do

    echo "$1"

    shift

done

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

1

2

3

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

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

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

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

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

#!/bin/bash

while [[ "$#" -ne 0 ]]

do

    echo "$1 $#"

    shift

done

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

1 3

2 2

3 1

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

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

Until循环

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

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

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

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

#!/bin/bash

until [[ "$i" -gt 3 ]]

do

    let "squ=i*i"

    echo "$squ"

    let "i++"

done

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

0

1

4

9

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

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

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

[zhangyongqiao.pt@v128217:~$] cat sorttest.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=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

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

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

Break循环控制符

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

[zhangyongqiao.pt@v128217:~$] cat sorttest.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" -gt 5 ]

    then

      break

    fi

done

[zhangyongqiao.pt@v128217:~$] ./sorttest.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

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

continue循环控制符的使用方式

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

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

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

#!/bin/bash

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

do

   if [ "$i" -eq 5 ]

   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=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

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

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

select的结构

基本结构

select variable in {list}

do

command

command

...
break

done

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

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

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

#!/bin/bash

echo "选择颜色:"

select color

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、付费专栏及课程。

余额充值