发布时间:2014-09-05 17:10:26作者:知识屋
还记得以前那个用算素数的正则表达式吗?编程这个世界太有趣了,总是能看到一些即别出心裁的东西。你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中?不要以为这不可能,这不,我在网上又看到了一个把Shell脚本整成面向对象的东西。Shell本来是不支持的,需要自己做点东西,能搞出这个事事的人真的是hacker啊。
当然,这里并不是真正的面向对象,因为其只是封装罢了,还没有支持继承和多态。最变态的是他居然还支持typeid,靠!
下面让我们看看他是怎么来做的。下面的脚本可能会有点费解。本想解释一下,后来想想,还是大家自己专研一下吧,其实看懂也不难,给大家提几个点吧。
我们可以看到,下面的这个脚本定义了class, func, var, new 等函数,其实这些就是所谓的关键字。
class是一个函数,主要是记录类名。
func和var实际上是把成员函数名和成员变量记成有相同前缀的各种变量。
new方法主要是记录实例。大家重点看看new函数里的那个for循环,最核心的就在那里了。
脚本如下所示:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 #!/bin/bash # ------------------------------------------------------------------- # OO support functions # Kludged by Pim van Riezen <pi@madscience.nl> # ------------------------------------------------------------------- DEFCLASS=""CLASS=""THIS=0 class() { DEFCLASS="$1" eval CLASS_${DEFCLASS}_VARS="" eval CLASS_${DEFCLASS}_FUNCTIONS=""} static() { return 0 } func() { local varname="CLASS_${DEFCLASS}_FUNCTIONS" eval "$varname=/"/${$varname}$1 /""} var() { local varname="CLASS_${DEFCLASS}_VARS" eval $varname="/"/${$varname}$1 /""} loadvar() { eval "varlist=/"/$CLASS_${CLASS}_VARS/"" for var in $varlist; do eval "$var=/"/$INSTANCE_${THIS}_$var/"" done} loadfunc() { eval "funclist=/"/$CLASS_${CLASS}_FUNCTIONS/"" for func in $funclist; do eval "${func}() { ${CLASS}::${func} /"/$*/"; return /$?; }" done} savevar() { eval "varlist=/"/$CLASS_${CLASS}_VARS/"" for var in $varlist; do eval "INSTANCE_${THIS}_$var=/"/$$var/"" done} typeof() { eval echo /$TYPEOF_$1 } new() { local local cvar="$2" shift shift local id=$(uuidgen | tr A-F a-f | sed -e "s/-//g") eval TYPEOF_${id}=$class eval $cvar=$id local funclist eval "funclist=/"/$CLASS_${class}_FUNCTIONS/"" for func in $funclist; do eval "${cvar}.${func}() { local t=/$THIS; THIS=$id; local c=/$CLASS; CLASS=$class; loadvar; loadfunc; ${class}::${func} /"/$*/"; rt=/$?; savevar; CLASS=/$c; THIS=/$t; return $rt; }" done eval "${cvar}.${class} /"/$*/" || true"}
下面,让我们来看看例程吧。
123456789101112131415161718192021222324252627282930313233343536373839404142 # ------------------------------------------------------------------- # Example code # ------------------------------------------------------------------- # class definition class Storpel func Storpel func setName func setQuality func print var name var quality # class implementation Storpel::Storpel() { setName "$1" setQuality "$2" if [ -z "$name" ]; then setName "Generic"; fi if [ -z "$quality" ]; then setQuality "Normal"; fi} Storpel::setName() { name="$1"; } Storpel::setQuality() { quality="$1"; } Storpel::print() { echo "$name ($quality)"; } # usage new Storpel one "Storpilator 1000" Medium new Storpel two new Storpel three two.setName "Storpilator 2000"two.setQuality "Strong" one.print two.print three.print echo "" echo "one: $one ($(typeof $one))"echo "two: $two ($(typeof $two))"echo "three: $three ($(typeof $two))"
(全文完)
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能