IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

面向对象的Shell脚本

酷壳 - CoolShell.cn 2011-07-21 23:58:20 累计浏览 6,095 次
本机暂存

还记得以前那个用算素数的正则表达式吗?编程这个世界太有趣了,总是能看到一些即别出心裁的东西。你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中?不要以为这不可能,这不,我在网上又看到了一个把Shell脚本整成面向对象的东西。Shell本来是不支持的,需要自己做点东西,能搞出这个事事的人真的是hacker啊。

当然,这里并不是真正的面向对象,因为其只是封装罢了,还没有支持继承和多态。最变态的是他居然还支持typeid,靠!

下面让我们看看他是怎么来做的。下面的脚本可能会有点费解。本想解释一下,后来想想,还是大家自己专研一下吧,其实看懂也不难,给大家提几个点吧。

  1. 我们可以看到,下面的这个脚本定义了class,  func, var, new 等函数,其实这些就是所谓的关键字。
  2. class是一个函数,主要是记录类名。
  3. func和var实际上是把成员函数名和成员变量记成有相同前缀的各种变量。
  4. 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))\"

(全文完)

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Bash的模式和配置文件加载 (累计阅读 24,410)
  2. 28个Unix/Linux的命令行神器 (累计阅读 16,791)
  3. 我常用的主机监控shell脚本 (累计阅读 13,433)
  4. 100个常用的linux命令 (累计阅读 11,607)
  5. Linux命令行里的“瑞士军刀” (累计阅读 11,584)
  6. 每个程序员都应该知道的8个Linux命令 (累计阅读 10,745)
  7. 最受欢迎的10个 Linux 单行命令 (累计阅读 10,131)
  8. Linux date 命令获取某日期的前一天 (累计阅读 9,880)
  9. PHP的异常原理与实例说明 Fatal error: Uncaught exception (累计阅读 9,763)
  10. linux下搜索find命令详解 (累计阅读 9,459)