面向对象的Shell脚本

标签: Unix/Linux 杂项资源 轶事趣闻 OOP Shell | 发表时间:2011-07-21 12:39 | 作者:陈皓 jejer
出处:http://coolshell.cn

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

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

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

  1. 我们可以看到,下面的这个脚本定义了class,  func, var, new 等函数,其实这些就是所谓的关键字。
  2. class是一个函数,主要是记录类名。
  3. func和var实际上是把成员函数名和成员变量记成有相同前缀的各种变量。
  4. new方法主要是记录实例。大家重点看看new函数里的那个for循环,最核心的就在那里了。
脚本如下所示:
#!/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"
}

下面,让我们来看看例程吧。

# -------------------------------------------------------------------
# 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 脚本] 推荐:

面向对象的Shell脚本

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

Mysql压力测试shell脚本

- - CSDN博客数据库推荐文章
转载请注明,来自: http://blog.csdn.net/skyman_2001. Mysql自带了压力测试工具mysqlslap,所以我们可以不用自己编写程序来测试Mysql读取的压力. 上面脚本的意思是每隔100ms循环做这样的事:模拟100个mysql客户端,对数据库test的表test执行200次插入(number-of-queries = concurrency * 每个mysql客户端的查询次数,所以这里的每个mysql客户端的查询次数是2次),迭代10次.

常用的主机监控Shell脚本

- - ITeye博客
最近时不时有朋友问我关于服务器监控方面的问题,问常用的服务器监控除了用开源软件,比如:cacti,nagios监控外是否可以自己写shell脚本呢. 根据自己的需求写出的shell脚本更能满足需求,更能细化主机监控的全面性. 下面是我常用的几个主机监控的脚本,大家可以根据自己的情况在进行修改,希望能给大家一点帮助.

shell脚本分析nginx日志

- - 互联网 - ITeye博客
以下脚本都是基于上面日志格式的,如果你的日志格式不同需要调整awk后面的参数. 分析日志中的UserAgent. 上面的脚本将分析出日志文件中最多的20个UserAgent. 分析日志中那些IP访问最多. 分析日志中那些Url请求访问次数最多. 已有 0 人发表留言,猛击->> 这里<<-参与讨论.

Shell 脚本自动Telnet 并执行远端机器的脚本

- - CSDN博客编程语言推荐文章
这里只是连接到远端机器,查看一下当前所在的目录. username/password 是telnet 到远端机器的用户名,密码. sleep 是一个等待时间,根据具体的机器状况或是执行命令的需要的时间来设置. 作者:oscar999 发表于2013-3-26 9:58:32 原文链接. 阅读:0 评论:0 查看评论.

Linux的系统安全设置Shell脚本

- QQ - 服务器运维与网站架构|Linux运维|互联网研究
本脚本是第二次更新,已经大量应用在某大型媒体网站体系中,加入了之前没有想到的一些安全设置. 使用方法将其复制,保存为一个shell文件,比如security.sh.将其上传到Linux服务器上,执行sh security.sh,就可以使用该脚本了. 建议根据自己的实际需要来修改此脚本,不要盲目使用.

一个自动安装LNMP的简洁Shell脚本

- QQ - 服务器运维与网站架构|Linux运维|互联网研究
此脚本在生产服务器上使用了一年多,本脚本崇尚简单唯美,只需要一个脚本就可以在任何一台有网络的服务器上自动配置LNMP. 本脚本会在脚本执行目录下,建packages目录用于存放LNMP所需要的软件. 1、把shell脚本的内容保存为nginx_php. 在脚本运行过程中需要输入一次y确认. 来源:http://www.freebsdsystem.org/nginx_php_shell/.

检查MySQL数据库服务器的shell脚本

- 铭文 - MySQLOPS 数据库与运维自动化技术分享
某著名电子商务公司的同事,编写的shell脚本,用于获得数据库服务器的数据库性能和配置,以及服务器负载LOAD等信息. shell脚本较长,也对shell脚本做了部分修改,同时为使技术朋友们更容易理解和使用,添加相关的文字和图片描述作为手册. 1.         功能描述. 执行shell命令:sh Get_Local_Kpi.sh –help,能显示相关信息,如图1-1:.

生成MySQL性能数据分析报告的Shell脚本

- EricSheng - MySQLOPS 数据库与运维自动化技术分享
【导读】 MySQL开源产品有非常丰富的分享出来可用的资源,比如本文要介绍的内容:如何每天简单地获得MySQL性能数据的报告,我们就可以利用perl脚本工具mysqlreport生成详细的性能数据分析报告,再借助sendEmail工具以邮件的方式发送出来,从而提高我们的工作效率,上期给大家介绍了SHELL脚本Get_Local_Kpi对我们工作的帮助.

(总结)Linux系统初始化优化Shell脚本

- 疯癫二楞子 - 服务器运维与网站架构|Linux运维|互联网研究
PS:本Shell脚本主要用于新安装Linux服务器系统的初始化工作,具体包括关闭ipv6模块、关闭selinux、让vim显示颜色、设置系统语言编码、优化系统服务、内核参数优化等. 可以根据自己的实际情况修改,可用于生产环境. 原作者是NetSeek,本人做了部分修改. cpuspeed | crond | irqbalance | microcode_ctl | mysqld | network | nginx | php-fpm | sendmail | sshd | syslog ).