SHELL [面向对象设计]
2011-07-22 11:51
357 查看
shell调式的时候,用
-n读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
-v一边执行脚本,一边将执行过的脚本命令打印到标准错误输出
-x提供跟踪执行信息,将执行的每一条命令和结果依次打印出来
下面是一个网上写的代码,有bug,已修正
#!/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 class="$1"
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))"
需要修改的原因
$*,保存了以$IFS指定的分割符所分割的字符串组。
$@,原样保存了参数列表,也就是"$1""$2"...
-n读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
-v一边执行脚本,一边将执行过的脚本命令打印到标准错误输出
-x提供跟踪执行信息,将执行的每一条命令和结果依次打印出来
下面是一个网上写的代码,有bug,已修正
#!/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 class="$1"
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))"
需要修改的原因
$*,保存了以$IFS指定的分割符所分割的字符串组。
$@,原样保存了参数列表,也就是"$1""$2"...
相关文章推荐
- 面向对象设计思想的7条原则
- 面向对象设计原则
- 面向对象设计原则---合成复用原则
- 面向对象设计 - OOD (开篇)
- 面向对象设计原则之一:单一职责原则
- java设计模式之面向对象思想
- 面向对象的设计法则1[Favor Composition Over Inheritance]
- 面向对象设计的几个基本的原则
- 面向对象六大设计原则
- JavaScript的面向对象设计
- javascript 设计模式之单体模式 面向对象学习基础
- 面向对象设计的三个基本要素与五个基本设计原则
- 面向对象设计的基本原则!
- 设计模式的艺术之道--面向对象设计原则
- 面向对象分析和设计(OOA/D) --- 一个例子
- java基础——面向对象设计方法
- 面向对象设计——原来“Lambda表达式”是这样来的
- 面向对象分析设计学习与探索(二):好的应用程序设计(Well-designed apps rock)
- python 进阶—面向对象和设计模式
- 面向对象设计七大原则