Unix中利用列表作为循环

【Unix中利用列表作为循环】在Unix操作系统中开发应用程序,循环语句可以说占了半壁江山 。由于Unix操作系统中采用的是shell编程环境,为此循环机制在结构上不同于其他的高级语言,如循环语句之一的for循环,就存在很大的差异 。笔者就跟大家介绍一下,在Unix操作系统中如何使用for循环以及相关的注意事项,帮助大家提高对这个for循环的利用程度 。
一、for循环的基本结构 。
在shell环境中,for循环主要有两部分组成,分别为循环列表于操作语句 。具体格式如下:
for variable in list (循环列表)
do
commands (操作语句)
done
从上面这个结构中可以看出,在for循环中使用变量和列表来定义循环列表 。另外,在利用do与done关键字将要执行的操作括起来 。其中变量的作用就是依次从循环列表中取值,并将这个参数值传递给操作语句,进行相关的操作 。其实,在学习这个for循环中,操作语句部分并没有多少的难度,或者说没有新鲜的内容 。因为这里就是一些unix操作系统的基本语句所构成的 。而其难点就是在于循环列表的确定 。因为这个循环列表关系到for循环运行的两个关键参数,一是循环的次数,二是循环内部操作所需要用到的参数值 。为此笔者在介绍这个for循环时,重点也是放在这个循环列表的设置上 。也就是说,系统工程师只要精通这个循环列表的编写,那么其他内容不会有问题 。
二、如何编制循环列表?
由于shell是一个跟Unix操作系统友好集成的编程环境,或者说是操作系统中的一个部分 。为此这个循环列表的定义方式要比高级语言的for循环丰富的多 。如可以使用很多操作系统的文件或者参数来作为其循环条件 。具体来说,系统工程师可以按照如下的规则来设置这个循环列表 。
1、 利用文件来作为循环列表 。
有时候可能列表比较大,如总共有100多个条目 。虽然可以依次将这些条目写在for语句的循环列表中,但是会大大的增加代码的长度,从而影响其阅读 。而且以后若要更改这些条目的话,还需要去更改这个源代码 。显然这会很麻烦 。如现在系统工程师需要查找在用户目录下,是否有用户想要的20个文件 。这20个文件名字没有什么规律 。正常情况下,用户需要一一输入文件名 。文件名输入一个,然后查询一次 。一共做二十次,显然这操作起来的工作量会非常的大 。如果这个文件的数目再增加的话,那么操作起来就会更加的麻烦 。在for循环中可以解决这个问题 。即只需要在循环列表中将这20个文件名字输入进去,然后再操作语句中通过查询操作在指定目录中查找看是否有相关的文件 。若有的话,将位置等信息保存到一个文件中 。这就可以简化用户的操作,只需要进行一个for循环即可 。同时还可以大幅度的缩短查询的时间 。
但是,此时遇到的一个问题就是要在for循环的循环列表中输入20个文件名字 。为此系统工程师希望能够将这些文件的名字保存在文件中,然后让for循环从文件中读取这些内容 。这即方便,而且也利于后续的调整 。其实在for循环中,是支持从文件中读取相关的列表信息 。不过这需要用到一个cat命令 。大家都知道,这个cat命令的用途主要是从一个文件中读取相关的信息 。如果用过管道符的系统工程师,一定知道,可以将某个命令的结果作为另外一个命令的参数 。其实,在这里用到的也是这个原理,只是不需要通过管道符来实现而已 。具体来说,这个循环列表可以如下定义 。For name in ‘cat filename.txt’(注意,由于其读取后变为了文本的内容,为此需要加上单引号) 。当for循环的列表很大,而且没有规律可循的话,虽然可以直接在循环列表中一一列出列表项,但这不是笔者所推荐的方法 。笔者认为,遇到这种情况时,最好能够向上面笔者建议的,将列表项保存在一个文件中 。然后在for循环的循环列表中利用cat命令进行读取 。由于此时这个文件跟程序是相对独立的,为此以后若需要调整这个列表项的值,不需要修改源代码即可以实现 。为此者也被认为是一种灵活性比较高的处理方式 。如果列表项需要经常调整,那么即使列表项的内容不是很多,也可以通过这种方法来提高其灵活性 。
2、 利用系统变量作为循环列表 。
在Unix操作系统中,for循环最大的特色,莫过于可以利用系统变量来作为循环列表 。如还是以查询操作为例,用户可能需要从指定的几个文件夹中查找某个文件 。而这几个目录都是有环境变量所确定的 。如一个系统工程师刚到企业,接替老的系统工程师的工作 。此时这位系统工程师就需要知道Unix服务器系统的一些基本配置 。而这其中有一项重要的内容就是一些重要环境变量的设置 。如安装了Oracle数据库,就需要知道其安装路径 。若安装了Mail服务器,则需要知道其邮件的存储位置与备份位置等等 。如果一一去查看这些环境变量,工作量会比较大 。如果换成是笔者的话,不会做这么没有效率的事情 。笔者的做法是,编写一个for循环,然后将这些重要的环境变量输出到一个文件中进行备份 。这将为笔者后续的工作带来很大的方便 。如现在笔者想知道Oracle的安装目录与mail的环境变量,就可以利用下面这个循环列表来实现 。
For varhome in $ORACLE_HOME $MAIL 。
在这个for循环中,笔者采用了系统的环境变量作为其循环语句 。当系统工程师利用系统环境变量来作为循环列表时,需要注意以下几个事项 。首先,这个列表项必须全部大写 。也就是说,系统变量必须大写这个规则也适用于这个for循环 。其次,再变量名之前必须加入$这个环境变量的符号,否则的话,编译器会无法识别 。三是在多个环境变量之间,不需要加入分隔符 。
3、 利用通配符作为循环列表 。
有时候可能系统管理员有这个要求 。在某个文件下有多以txt为扩展名的文件 。现在系统工程师可能想一一统计这些文件的大小、创建日期、更新日期等等信息,然后将这些统计信息保存到一个文件中 。或者想对这些文件进行改名,如在原先的名字之前加上一个backup的字符串,表示这些文件是备份文件 。此时,如果一一对这些文件操作的话,会比较麻烦 。那么比较合理的做法就是通过for循环来一次性完成这些任务 。
此时,如何书写这个循环列表呢?笔者认为比较合理、比较简便的方法就是通过通配符来实现 。如可以利用如下语句来实现:for filename in *.txt 。利用这个循环列表,系统就会从目录中查找所有以.txt为扩展名的文件,然后将其为参数,进行后续的操作 。如用户需要进行文件更名的话,则可以使用sed操作来对文件进行重命名 。在使用通配符作为循环列表中的参数时,最好采用合适的通配符 。因为通配符*或者%其含义不尽相同 。如果系统工程师能够了解他们其中的差异,并在这里对症下药,选择合适的通配符 。那么就可以起到事半功倍的效果 。
在for循环中除了使用上面三种特殊的循环列表外,系统工程师往往还可能采用位置参数作为循环列表 。如可以将命令行中的参数赋值给位置参数,来实现一些比较复杂的功能 。由于篇幅限制,笔者在这里不对这个位置参数做详细的解释了 。如有有需要的话,笔者在以后的文章中会谈到这个问题 。