这里笔者列举一下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的命令对空格的敏感度问题,在命令(while,if,echo等等)后一般都需要空格隔开,便于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的语法结构做入门。