如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
面向对象的Shell脚本还记得以前那个用HYPERLINK"http://coolshell.cn/articles/2704.html"\o"检查素数的正则表达式"\t"_blank"算素数的正则表达式吗?编程这个世界太有趣了,总是能看到一些即别出心裁的东西。你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中?不要以为这不可能,这不,我在HYPERLINK"http://lab.madscience.nl/oo.sh.txt"\t"_blank"网上又看到了一个把Shell脚本整成面向对象的东西。Shell本来是不支持的,需要自己做点东西,能搞出这个事事的人真的是hacker啊。当然,这里并不是真正的面向对象,因为其只是封装罢了,还没有支持继承和多态。最变态的是他居然还支持typeid,靠!下面让我们看看他是怎么来做的。下面的脚本可能会有点费解。本想解释一下,后来想想,还是大家自己专研一下吧,其实看懂也不难,给大家提几个点吧。我们可以看到,下面的这个脚本定义了class,func,var,new等函数,其实这些就是所谓的关键字。class是一个函数,主要是记录类名。func和var实际上是把成员函数名和成员变量记成有相同前缀的各种变量。new方法主要是记录实例。大家重点看看new函数里的那个for循环,最核心的就在那里了。脚本如下所示:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#!/bin/bash#-------------------------------------------------------------------#OOsupportfunctions#KludgedbyPimvanRiezen<pi@madscience.nl>#-------------------------------------------------------------------DEFCLASS=""CLASS=""THIS=0class(){DEFCLASS="$1"evalCLASS_${DEFCLASS}_VARS=""evalCLASS_${DEFCLASS}_FUNCTIONS=""}static(){return0}func(){localvarname="CLASS_${DEFCLASS}_FUNCTIONS"eval"$varname=\"\${$varname}$1\""}var(){localvarname="CLASS_${DEFCLASS}_VARS"eval$varname="\"\${$varname}$1\""}loadvar(){eval"varlist=\"\$CLASS_${CLASS}_VARS\""forvarin$varlist;doeval"$var=\"\$INSTANCE_${THIS}_$var\""done}loadfunc(){eval"funclist=\"\$CLASS_${CLASS}_FUNCTIONS\""forfuncin$funclist;doeval"${func}(){${CLASS}::${func}\"\$*\";return\$?;}"done}savevar(){eval"varlist=\"\$CLASS_${CLASS}_VARS\""forvarin$varlist;doeval"INSTANCE_${THIS}_$var=\"\$$var\""done}typeof(){evalecho\$TYPEOF_$1}new(){locallocalcvar="$2"shiftshiftlocalid=$(uuidgen|trA-Fa-f|sed-e"s/-//g")evalTYPEOF_${id}=$classeval$cvar=$idlocalfunclisteval"funclist=\"\$CLASS_${class}_FUNCTIONS\""forfuncin$funclist;doeval"${cvar}.${func}(){localt=\$THIS;THIS=$id;l