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