使用bash脚本创建类和对象

Fab*_*eel 8 linux bash class object

我正在尝试使用bash脚本来使脚本像电话簿一样,所以我试图创建类和对象,但不幸的是我找不到办法做到这一点!所以我问如何使用bash脚本创建一个类?

Max*_*rin 48

你可以尝试做这样的事情

example.sh

#!/bin/bash

# include class header
. obj.h
. system.h

# create class object
obj myobject

# use object method
myobject.sayHello

# use object property
myobject.fileName = "file1"

system.stdout.printString "value is"
system.stdout.printValue myobject.fileName
Run Code Online (Sandbox Code Playgroud)

obj.h

obj(){
    . <(sed "s/obj/$1/g" obj.class)
}
Run Code Online (Sandbox Code Playgroud)

obj.class

# Class named "obj" for bash Object

# property
obj_properties=()

# properties IDs
fileName=0
fileSize=1

obj.sayHello(){
    echo Hello
}

obj.property(){
    if [ "$2" == "=" ]
    then
        obj_properties[$1]=$3
    else
        echo ${obj_properties[$1]}
    fi
}

obj.fileName(){
    if [ "$1" == "=" ]
    then
        obj.property fileName = $2
    else
        obj.property fileName
    fi
}
Run Code Online (Sandbox Code Playgroud)

system.h中

. system.class
Run Code Online (Sandbox Code Playgroud)

system.class

system.stdout.printValue(){
    echo $($@)
}

system.stdout.printString(){
    echo $@
}
Run Code Online (Sandbox Code Playgroud)

链接供参考:https://github.com/mnorin/bash-scripts/tree/master/objects 关键是你不能创建对象,但你可以在bash中模拟面向对象的编程

  • 该问题的实际答案即使从技术上讲并没有一个答案,再加上10个创造力。必须了解OOP只是一个概念。如果将其分解为二进制,则本质上不会发生任何“ OOP”。那么为什么不像上面那样在Shell中没有对象。 (4认同)
  • @Sunfloro,使用 bash 脚本时,使用“.”或“source”并不重要,因为它不会在 POSIX shell 中运行。使用 bash 脚本时,“充分”利用 bash 语法,而不需要担心 POSIX shell 兼容性,但请尽量避免在 bash 脚本中混合其他脚本语言,例如“sed”、“awk”、“grep”(可以使用模式来避免)。同样,在使用 POSIX shell 脚本时,请充分利用这一点。这是我所学到的,也是我在关注跨平台可移植性的实践中使用的。 (2认同)
  • @minusone,太棒了。顺便说一句,这个脚本也使用关联数组(`obj_properties[$1]=$3`),所以它也不兼容 bash3。 (2认同)

Tac*_*0sS 10

所以我记得几年前检查了这个问题并回答了......并且在想......什么!?!?!

然后上周我仔细查看了@Maxims 的答案,然后就清楚了..

我花了上周的时间为类对象创建了一个 bash 类转译器和类加载器,以及方法和其他好东西..这一切都是因为我想创建一个终端动画基础设施:

两个项目在终端中被动画化

所以虽然这只是一个开始,但我发现这是一个超级酷和具有挑战性的冒险......我希望我的代码也能帮助其他人

顺便说一句:仅在 MAC OS 上进行了测试,因此可能需要进行一些调整:)


Sai*_*Hax 9

Bash是一种脚本语言,不支持OOP,所以你不能.试试Python.

你唯一能做的就是有几个数组,但这很麻烦.使用索引链接它们.