循环语句:
Bash Shell中主要提供了三种循环方式:for、while和until。
一、for循环
for循环的运作方式,是讲串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done 之间),直到所有元素取尽为止。
其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。
for的语法结构如下:
1
2
3
4
|
for
变量
in
串行
do
执行命令
done
|
说明:
行1,讲串行中的字段迭代放入变量中
行2-4,接着将重复执行do和done之间的命令区域,直到串行中每一个字段军处理过为止。
流程图:
用例1
用for循环在家目录下创建aaa1-aaa10,然后在aaa1-aaa10创建bbb1-bbb10的目录
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/bin/bash
for
k
in
$(
seq
1 10 )
do
mkdir
/home/kuangl/aaa
${k}
cd
/home/kuangl/aaa
${k}
for
l
in
$(
seq
1 10 )
do
mkdir
bbb${l}
cd
/home/kuangl/aaa
${k}
done
cd
..
done
|
说明:
行2,seq 用于产生从某个数到另外一个数之间的所有整数。
行4,在家目录下创建文件夹。
行6,在使用一个for循环创建文件夹
测试结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[root@test01 kuangl]
# ll
total 80
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa1
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa10
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa2
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa3
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa4
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa5
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa6
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa7
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa8
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa9
[root@test01 kuangl]
# cd aaa1
[root@test01 aaa1]
# ll
total 40
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb1
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb10
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb2
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb3
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb4
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb5
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb6
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb7
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb8
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb9
|
1
|
|
用例2
列出var目录下各子目录占用磁盘空间的大小。
1
2
3
4
5
6
7
|
#!/bin/bash
DIR=
"/var"
cd
$DIR
for
k
in
$(
ls
$DIR)
do
[ -d $k ] &&
du
-sh $k
done
|
说明:
行4,对/var目录中每一个文件,进行for循环处理。
行6,如果/var下的文件是目录,则使用du -sh计算该目录占用磁盘空间的大小。
测试结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[root@test01 scripts]
# ./var.sh
276M cache
4.0K cvs
84K db
8.0K empty
4.0K
ftp
4.0K games
4.0K gdm
21G lib
4.0K
local
16K lock
7.4G log
4.0K logs
0 mail
4.0K nis
4.0K opt
4.0K preserve
336K run
3.7G spool
212K tmp
4.1G www
4.0K yp
|
二、while循环
while循环的语法:
1
2
3
4
|
while
条件测试
do
执行命令
done
|
说明:
行1,首先进行条件测试,如果传回值为0(条件测试为真),则进入循环,执行命令区域,否则
不进入循环,介绍while 命令
行3,执行命令区域,这些命令中,应该要有改变条件测试的命令,这样,才有机会在
有限步骤后结束执行while循环(除非想要执行无穷循环)。
行4,回到行1,执行while命令
流程图:
用例1
while循环,经典的用法是搭配转向输入,读取文件的内容,做法如下:
1
2
3
4
5
|
#!/bin/bash
while
read
kuangl
do
echo
${kuangl}
done
<
/home/kuangl/scripts/testfile
|
说明:
行2,使用read有标准输入读取数据,放入变量kuangl中,如果读到的数据非空,就进入循环。
行4,把改行数据显示出来
行5,将/home/kuangl/scripts/testfile的内容转向输入将给read读取。
测试结果:
1
2
3
|
[root@test01 scripts]
# ./while_test01.sh
aaaaaaa
bbbbbbb
|
用例2:
1
2
3
4
5
6
7
8
9
|
#!/bin/bash
declare
-i i=1
declare
-i
sum
=0
while
((i<=10))
do
let
sum
+=i
let
++i
done
echo
$
sum
|
说明:
行2-3,声明i和sum为整数型
行4,如果条件测试:只要i值小于或者等于10,就执行循环。
行6,sum+=i和sum=sum+i是一样的,sum累加上i。
行7,i的值递增1,此行是改变条件测试的命令,一旦i大于10,可终止循环。
行8,遇到done,回到行6去执行条件测试
行9,显示sum的值为55
测试结果:
1
2
|
[root@test01 scripts]
# ./while_02.sh
55
|
1
|
|
三、until循环
while循环的条件测试是测真值,until循环则是测假值。
until循环的语法:
1
2
3
4
|
until
条件测试
do
执行命令
done
|
说明:
行1,如果条件测试结果为假(传回值不为0),就进入循环。
行3,执行命令区域。这些命令中,应该有改变条件测试的命令,这样子,才有机会在有限步骤后结束执行until 循环(除非你想要执行无穷循环)。
行4,回到行1,执行until命令。
流程图:
用例1:
1
2
3
4
5
6
7
8
9
|
#!/bin/bash
declare
-i i=10
declare
-i
sum
=0
until
((i>10))
do
let
sum
+=i
let
++i
done
echo
$
sum
|
说明:
行2-3,声明i和sum为整数型
行4,如果条件测试:只要i值未超过10,就进入循环。
行6,sum+=i和sum=sum+i是一样的,sum累加上i。
行7,i的值递增1,此行是改变条件测试的命令,一旦i大于10,可终止循环。
行8,遇到done,回到行6去执行条件测试
行9,显示sum的值为10
测试结果:
1
2
|
[root@test01 scripts]
# ./until_test01.sh
10
|