仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2167|回复: 19
打印 上一主题 下一主题

[其他Linux] Linux教程之面向对象的Shell剧本仓酷云

[复制链接]
第二个灵魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:30:10 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
由于在linux中,用户权限很大,做任何事情都很自由,所以,你往往需要知道你做的每一步在干什么。
还记得之前谁人用算素数的正则表达式吗?编程这个天下太风趣了,老是能看到一些即别开生面的工具。你有无想过在写Shell剧本的时分能够把你的变量和函数放到一个类中?不要觉得这不成能,这不,我在网上又看到了一个把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;localc=$CLASS;CLASS=$class;loadvar;loadfunc;${class}::${func}"$*";rt=$?;savevar;CLASS=$c;THIS=$t;return$rt;}"doneeval"${cvar}.${class}"$*"||true"}上面,让我们来看看例程吧。
123456789101112131415161718192021222324252627282930313233343536373839404142#-------------------------------------------------------------------#Examplecode#-------------------------------------------------------------------#classdefinitionclassStorpelfuncStorpelfuncsetNamefuncsetQualityfuncprintvarnamevarquality#classimplementationStorpel::Storpel(){setName"$1"setQuality"$2"if[-z"$name"];thensetName"Generic";fiif[-z"$quality"];thensetQuality"Normal";fi}Storpel::setName(){name="$1";}Storpel::setQuality(){quality="$1";}Storpel::print(){echo"$name($quality)";}#usagenewStorpelone"Storpilator1000"MediumnewStorpeltwonewStorpelthreetwo.setName"Storpilator2000"two.setQuality"Strong"one.printtwo.printthree.printecho""echo"one:$one($(typeof$one))"echo"two:$two($(typeof$two))"echo"three:$three($(typeof$two))"
(全文完)

学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 06:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表