面向对象的Shell脚本
浏览:5210次 出处信息
还记得以前那个用算素数的正则表达式吗?编程这个世界太有趣了,总是能看到一些即别出心裁的东西。你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中?不要以为这不可能,这不,我在网上又看到了一个把Shell脚本整成面向对象的东西。Shell本来是不支持的,需要自己做点东西,能搞出这个事事的人真的是hacker啊。
当然,这里并不是真正的面向对象,因为其只是封装罢了,还没有支持继承和多态。最变态的是他居然还支持typeid,靠!
下面让我们看看他是怎么来做的。下面的脚本可能会有点费解。本想解释一下,后来想想,还是大家自己专研一下吧,其实看懂也不难,给大家提几个点吧。
- 我们可以看到,下面的这个脚本定义了class, func, var, new 等函数,其实这些就是所谓的关键字。
- class是一个函数,主要是记录类名。
- func和var实际上是把成员函数名和成员变量记成有相同前缀的各种变量。
- new方法主要是记录实例。大家重点看看new函数里的那个for循环,最核心的就在那里了。
脚本如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 |
#!/bin/bash # ------------------------------------------------------------------- # OO support functions # Kludged by Pim van Riezen # ------------------------------------------------------------------- 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\" } |
下面,让我们来看看例程吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 |
# ------------------------------------------------------------------- # 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))\" |
(全文完)
建议继续学习:
- 你可能不知道的Shell (阅读:6992)
- 在 shell 脚本里打日志 (阅读:4838)
- Bash如何取得当前正在执行的脚本的绝对路径? (阅读:4895)
- 使用Shell快捷键助你一臂之力 (阅读:4506)
- 用星际争霸讲解面向对象的概念 (阅读:4206)
- 使用PHP创建一个面向对象的博客 (阅读:4132)
- Bash Shell 快捷键 (阅读:4019)
- shell文件存在相关判断参数 (阅读:3567)
- 加密你的shell (阅读:3666)
- PHP面向对象编程的三大特性 (阅读:3449)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
后一篇:JSON对象和字符串之间的相互转换 >>
文章信息
- 作者:陈皓 来源: 酷壳 - CoolShell.cn
- 标签: shell 对象
- 发布时间:2011-07-21 23:58:20
建议继续学习
近3天十大热文
- [71] IOS安全–浅谈关于IOS加固的几种方法
- [69] Twitter/微博客的学习摘要
- [65] 如何拿下简短的域名
- [64] android 开发入门
- [63] Go Reflect 性能
- [62] find命令的一点注意事项
- [60] 流程管理与用户研究
- [59] 图书馆的世界纪录
- [59] 读书笔记-壹百度:百度十年千倍的29条法则
- [58] Oracle MTS模式下 进程地址与会话信