面向对象思想在shell编程中的使用

1、面向对象思想

面向对象编程时,最关键的或者最具特点的就是有一个或若干个。但是在Shell脚本语言中没有这种关键字或者数据结构,所以我们在这只用一些面向对象编程中的思想。


2、 如何在Shell中实现一个“类”

——具有相同或相似性质的对象的抽象。

在Shell脚本语言中并没有这种数据结构的关键字。那我们如何在shell中实现类的一些使用方法呢?

这里我们使用多个数组结构来实现一些类的思想。


3、实例讲解

在此以一个小项目实例来讲解一下在Shell中如何实现“类”的使用——压缩文件自动解压脚本

3.1、设计思路

  1. 通过参数形式,脚本获取需解压文件的路径和文件名
  2. 识别文件名后缀,确认是什么格式的压缩文件
  3. 根据后缀选择相应的解压命令把压缩文件解压

3.2、面向过程思想的实现方式

依据前面的设计思路我们如果按照面向过程的设计思想实现起来也是比较简单的。实现代码如下:
 

if [ $file == *tar.gz* ];then
     tar zxvf $file
fi

这里只截取了一个代码段。$file变量表示我们传入的文件名。这里以tar.gz格式的文件举例。如果文件名中包含tar.gz这个关键字,然后就使用tar命令来解压文件。

这种实现方式看似简单,但是也有个问题:如果支持多种压缩文件格式,脚本的篇幅就会很长,如下:

if [ $file == *tar.gz* ];then
     tar zxvf $file
fi

if [ $file == *zip* ];then
     unzip $file
fi

#=====================#
#=====================#
#在此省略其他多重文件格式
#=====================#
#=====================#
if [ $file == *bz2* ];then
     bzip2 -d $file
fi

如果支持的文件类型变多,脚本的篇幅就会很长,增加后续的维护成本,而且代码具有相似性,重复代码很多。

3.3、面向对象思想实现方式

这里呢,我们使用多个**数组**来实现面向对象的思想和使用方式。

suffix_array=(tar.gz zip bz2 tar.bz2 rar)   #数组1
    cmd_array=("tar zxf" "unzip"  "bzip2 -d" "tar jxf" "rar a") #数组2

我们定义两个数组,第一个数据存放文件后缀的关键字,另一个存放文件解压命令。
设计思路稍做修改:
1. 通过参数形式,脚本获取需解压文件的路径和文件名
2. 遍历数组1,是否与传入的文件后缀匹配,匹配返回数组下标index
3. 使用数组2中index位置的命令来解压文件。

 

这样呢就可以通过数组的下标来访问数组中的内容,shell数组的使用还是非常灵活的,数组中可以存储关键字、shell命令或者自定义的函数。这样多个数组的集合就形成了一个的相似结构,每个数组都通过下标的方式访问,可以直接得到关键字、运行shell命令或者执行自定义的函数。每个下标或者索引就形成了一个个对象。

通过这种思路可以大大减少我们的脚本的维护成本,而且在代码的篇幅也能得到控制。