Shell虽无原生OOP特性,但可通过命名前缀模拟类、参数传递替代this、local/子shell实现实例隔离、函数组合模拟方法链,达成面向对象风格的数据与行为组织。

Shell 本身是面向过程语言,不支持类、继承、封装等原生面向对象特性。但可以通过约定和结构模拟“面向对象风格”,重点在于数据与行为的组织方式——把相关变量(数据)和操作函数(行为)绑定起来,用命名前缀、参数传递、局部作用域等手段实现逻辑聚类和接口抽象。
用命名空间+前缀模拟“类”概念
Shell 没有 class 关键字,但可以用统一前缀区分不同“对象”的函数和变量,避免全局污染:
- 定义一组以 user_ 开头的函数:
user_create、user_delete、user_show - 所有与用户相关的状态变量也加前缀,如
user_name、user_id(注意:这些变量需在调用上下文中显式传入或通过全局约定管理) - 相当于把“User 类”拆成一组协作函数,靠命名达成语义封装
用参数传递“实例数据”替代 this/self
Shell 函数没有隐式对象上下文,但可以显式把数据结构(如字符串拼接的伪对象)作为第一个参数传入:
- 例如定义
file_open() { local path="$1"; echo "Opening $path"; } - 调用时写
file_open "/etc/hosts",相当于obj.open("/etc/hosts") - 若需多字段,可用冒号分隔的字符串模拟结构体:
"name:log.txt:size:1024",再用IFS=':' read -r name _ size _ 解析
用子 shell 或局部变量控制作用域,模拟“实例隔离”
避免多个“对象实例”互相干扰的关键是作用域管理:
- 函数内一律用
local声明变量,防止覆盖全局同名变量 - 对需要完整隔离的场景,用
( ... )启动子 shell 执行整段逻辑,内部变量天然不泄露 - 比如
process_run() { ( local pid=$1; echo "PID $pid running"; ps -p "$pid" ); },每次调用都是独立环境
用函数返回值+标准输出组合模拟方法调用链
Shell 不支持链式调用(如 obj.method1().method2()),但可通过命令替换和管道近似实现:
get_user_name "$uid" | to_upper | add_prefix "USER:"- 每个函数只做一件事,输入从 stdin 或参数来,输出到 stdout,符合 Unix 哲学,也贴近 OOP 中“方法返回新对象”的思路
- 配合
case或if可实现简单多态,例如根据第一个参数选择行为:disk_usage listvsdisk_usage summary











