更多结构化命令

 更多结构化命令

       包括forwhileuntil命令。

10.1 for命令

       for命令循环的基本格式为:

for var in list

do

       commands

done

       在参数list中提供了一些列用于迭代的值,每次迭代中,变量var包含列表的当前值。第一次迭代使用列表中的第一项,第二次迭代使用第二项。

       进入dodone语句之间的命令可以是一条或多条的标准bash shell命令。在命令中,变量$var包含当前迭代的列表项值

       注意,在done以后,变量var仍然为最后一次值,直到它被改变为止。

       对于列表中如果有比较复杂的值,比如don’t,需要用\转义或者用双引号括起来。

       And对于shell而言,for循环认为每个值都用空格分隔,但是如果想打印New York,该如何办呢?此时还是需要将该值用双引号括起来,为“New York”

       给列表赋新值:

list = “Shangdong Shangxi Henan Shanghai”

list=$list” Beijing”

 

       如果我们已经有了一个文件,可以使用cat file来生成一个列表,在shell中使用反引号字符来输出命令。

10.1.5 改变字段分隔符

       环境变量IFSinternal field separator)定义了bash shell的内部字段分隔符的字符列表。默认情况下,bash shell将下面的字符看作是字段分隔符:

l  空格

l  制表符

l  换行符

所以,如果在读入文件的时候,我们可以暂时在shell中更改变量IFS的值,显示bash shell看做是字段分隔符的字符。例如IFS=$’\n’就会只是把换行当作字段分隔符,在/etc/passwd中就可以使用IFS=$:来设置为冒号。

       不过在更换之前,最好先做一下备份,防止忘掉以前的设置。如:

IFS.OLD=$IFS

IFS=$’\n’

<use the new IFS value in code>

IFS=$IFS.OLD

       如果想指定多个IFS字符,只需要将它们在赋值行中串联起来即可。

10.1.6 使用通配符读取目录

       文件通配(file globbing)是生成与指定通配符匹配的文件或路径名的过程。当不知道目录中所有的文件名时,这个功能非常好。

10.2 C式的for命令

10.2.1 C语言中的for命令

       基本格式:

for((variable assignment; condition; iteration process))

       注意,有几项不遵循标准bash shellfor方法:

l  变量的赋值可以包含空格;

l  条件中的变量不以美元符号做前缀;

l  迭代处理不适用expr命令格式;

10.2.2 使用多个变量

       C式的for命令也允许使用多个变量迭代,但是只可以在for循环中定义一个条件。

10.3 while命令

       while命令有点像if-then语句和for循环间的结合。

10.3.1 while的基本格式

while命令的格式是:

while test command

do

       other commands

done

10.3.2 使用多条测试命令

       While命令允许在while语句行定义多条test命令,只有最后一条测试命令的退出状态时用来决定循环是何时停止的。

10.4 until命令

       until命令刚好与while命令相反。until命令需要指定一条测试命令,这条命令通常产生一个非0的退出状态,这样测试命令的退出状态非0bash shell就会执行在循环当中的命令。一旦测试条件返回0退出状态,循环停止。

       until命令的格式为:

until test command

do

       other commands

done

10.5 嵌套循环

       一条循环语句可以在循环中使用任何类型的命令,包括其他循环命令。这称为嵌套循环。

10.6 文件数据的循环

       通常需要迭代存储在文件内部的项,这就需要结合两种介绍过的技术:

l  使用嵌套循环;

l  更改环境变量IFS

10.7 控制循环

10.7.1 break命令

       退出任何类型的循环,包括while循环和until循环。

       注意break n,其中n默认情况向是1,代表跳出当前循环,如果将n设置为2break命令将停止外循环的下一级循环。

10.7.2 continue命令

       提前停止循环内命令,而不完全停止循环的方法。例如

for ((var = 1; var < 15; var ++))

do

 if [$var –gt 5] && [$var –lt 10]

       then

              continue

       fi

echo “iteration number: $var”

done

该脚本将输出1~510~14

10.8 处理循环的输出

       最后可以在shell脚本中使用管道或者重定向循环输出结果,可以通过在done命令的末尾添加命令来做到:

for ((var = 1; var < 15; var ++))

do

 if [$var –gt 5] && [$var –lt 10]

       then

              continue

       fi

echo “iteration number: $var”

done > output.txt

shell将把for结果重定向到output.txt,而不是显示在监视器上。

10.9 小结

l  for命令能够迭代值列表,无论是命令行内部提供的还是包含在变量中的,或者使用文件通配符从通配符中提取文件和目录的名称;

l  while命令提供一种基于命令的条件进行循环的一种方法,可以使用普通命令或测试命令来测试变量条件,只要命令生成零退出状态,while循环将继续重复指定的命令集;

until命令也提供一种重复命令的方法,但是它是基于一条命令或条件生成非零退出状态。这个特性允许我们在重复停止之前设定一个必须满足的条件。