`

面向对象的Shell脚本

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

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

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

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

相关推荐

    python编写shell脚本

    4. **面向对象编程**:Python 支持面向对象编程,可以更好地组织代码结构。 5. **跨平台性**:Python 是一种跨平台的语言,可以在多种操作系统上运行,包括 Windows、Linux 和 macOS。 #### 三、Python 编写 Shell ...

    swift-ShellKit用于运行shell脚本的Objective-C框架

    ShellKit的设计理念是简洁易用,允许开发者以一种面向对象的方式处理shell命令。它封装了诸如创建进程、传递参数、捕获标准输入、输出和错误流等功能,使你能够更高效地进行系统操作和自动化任务。 在使用ShellKit...

    shell脚本的介绍与教学

    - **面向对象**:强调的是对象及其属性和行为之间的交互。 #### Bash Shell **Bash**(Bourne-Again SHell)是最常用的Shell之一,广泛应用于各种Linux发行版中。以下是Bash的一些核心特点: 1. **命令和文件自动...

    6 SHELL脚本编程.pdf

    编程风格分为面向过程和面向对象两种,面向过程强调按步骤完成任务,而面向对象则将编程看成是设置事物以完成特定功能。 编程语言主要分为低级语言和高级语言。低级语言接近计算机硬件,如汇编语言;高级语言则更...

    基于Java与Shell脚本的内网系统巡逻设计源码

    Java语言因其平台无关性、面向对象、安全性高等特点,被广泛应用于企业级开发中,尤其是在需要高稳定性和安全性的系统开发中。这些Java源文件可能是负责网络通信、数据处理、用户界面展示、逻辑处理等功能模块的核心...

    精通UNIX Shell脚本编程(附源代码)

    Randal K.Michael是一位在可口可乐公司任职的UNIX系统管理员,他编写了许多shell脚本来处理 UNIX下复杂的系统监视和事件通知问题。他具有23年的工作经验:同时担任UNIX系统管理员达10年 之久,熟悉Solaris、Linux、...

    基于Java和Shell脚本的家庭助手工程助手后台服务设计源码

    该项目采用Java语言进行开发,Java作为一种面向对象的编程语言,其跨平台、安全稳定、多线程等特性使其成为开发复杂企业级应用的理想选择。在该项目中,Java被用来编写业务逻辑层、数据访问层、服务接口层等多个层次...

    shell-plus-plus:一种友好且现代的面向对象功能的Shell脚本语言

    **Shell Plus Plus:一个创新的、面向对象的Shell脚本语言** Shell脚本语言作为Linux和Unix系统中的重要工具,一直以来都是系统管理员和开发者进行自动化任务处理和命令行操作的首选。然而,传统的Shell(如Bash)...

    基于Java与Shell脚本的时间序列分析程序设计源码

    Java语言在开发中以其跨平台性、面向对象和安全性闻名,非常适合构建可移植和稳定的企业级应用。而Shell脚本语言则以其简单、高效著称,广泛应用于系统自动化和任务调度。将这两种语言结合,一方面可以利用Java进行...

    Ruby和Shell脚本实现判断成绩及格功能

    Ruby是一种面向对象的、动态类型的编程语言,它的语法简洁明了。在给出的Ruby脚本中,我们首先通过`#!/usr/bin/ruby`声明这是一个Ruby脚本,然后通过`print "请输入您的分数: "`提示用户输入分数。接着,`gets.to_i`...

    基于Java语言的App-Server-Core设计源码与Shell脚本兼容性优化

    在现代软件开发中,Java语言因其跨平台性、面向对象、安全性等特点而广受欢迎。Java App-Server-Core是基于Java语言开发的应用服务器核心,它通常包含了应用服务运行所需的基础框架和组件。优化App-Server-Core的...

    基于Java及Shell脚本技术的权限管理称重后台系统设计源码

    Java作为一种广泛使用的编程语言,因其跨平台性、面向对象等特性而备受青睐。在该项目中,Java的使用比重极大,共包含268个Java源文件。这些Java源文件构成了后台系统的主要逻辑框架,包括数据处理、用户权限验证、...

    Shell-Perl-Python脚本入门教程PDF

    5. **面向对象编程**:Python支持类和对象的概念,可以创建自定义类并实现继承、封装和多态。 6. **异常处理**:使用try-except-finally结构处理程序运行时可能遇到的错误。 7. **标准库**:Python的标准库非常...

    基于Java及Shell脚本的数据共享平台设计源码

    165个Java源代码文件构成了平台的核心业务逻辑和功能实现,它们通过面向对象的方式组织代码,确保了程序的模块化和可维护性。39个XML配置文件则负责存储了应用的各种配置信息,它们是应用运行时读取和使用的重要资源...

    基于Java与Shell脚本的多线程服务器批量管理简易系统设计源码

    EasyXMS系统以Java语言作为主要开发语言,并结合了Shell脚本,这意味着它能够充分利用Java语言在跨平台、面向对象设计上的优势,同时也能够发挥Shell脚本在Linux环境下强大系统管理能力的特点。在系统架构上,...

    用于开发、测试和CI的自动化脚本_Shell_Python_下载.zip

    Shell脚本是Linux或Unix操作系统中的一种脚本语言,主要用于系统管理和任务自动化。它的核心在于Bash(Bourne-Again SHell),是大多数Linux发行版的默认Shell。以下是一些关于Shell脚本的关键概念: 1. **变量**:...

    Linux服务器的常用工具和安装shell脚本。安装脚本包括:PHP、NodeJS、Pytho

    本篇内容旨在深入解析Linux服务器常用工具的安装和应用,特别关注的是通过shell脚本自动化部署这些工具,从而实现高效便捷的服务器配置。 首先,PHP是一种广泛应用于Web开发的开源服务器端脚本语言,与HTML紧密集成...

    scripts:有用的shell脚本

    Python的脚本通常需要通过解释器运行,它支持面向对象编程,提供了大量的第三方库,如NumPy用于科学计算,Pandas用于数据处理,matplotlib用于数据可视化等。 总的来说,这个压缩包"scripts:有用的shell脚本"很可能...

    code shell c c++

    标题中的"code shell c c++"表明我们讨论的是与编程相关的主题,特别是C、C++编程语言以及Shell脚本。C和C++是两种广泛使用的系统级编程语言,而Shell则是Unix/Linux操作系统中用于交互式命令行操作和编写自动化脚本...

Global site tag (gtag.js) - Google Analytics