在Bash中实现类模块导入:导入模块的EXPORTS关联数组
实现Bash中的基础模块导入功能
你这个思路挺巧妙的——通过模块内的EXPORTS关联数组标记要对外暴露的内容,再用自定义的import函数把这些内容映射到指定的变量里,完全贴合Shell脚本的特性。我帮你把代码整理完整并补充关键细节的说明:
主文件(已导入Bash会话的脚本)
#!/bin/bash import () { # 动态声明一个关联数组,用来存储导入的模块内容 eval "declare -A $1" # 加载目标模块脚本,让模块的EXPORTS数组进入当前会话 source "$2" # 遍历模块的EXPORTS数组,将每个键值对赋值到我们创建的数组中 for i in "${!EXPORTS[@]}" do echo "from import (line 9): ${1}[$i]=${EXPORTS[$i]}" eval "${1}[$i]=${EXPORTS[$i]}" done }
模块文件示例(比如module.sh)
要被导入的模块需要定义EXPORTS关联数组,把要导出的内容放在里面:
#!/bin/bash # 定义模块对外暴露的内容 declare -A EXPORTS=( [greet]="Hello from the module!" [version]="1.0.0" [get_date]='date +%Y-%m-%d' )
使用示例
在Bash会话里这样调用就能导入模块:
# 将module.sh的内容导入到MYMODULE关联数组中 import MYMODULE module.sh # 访问导入的内容 echo "${MYMODULE[greet]}" # 执行导出的命令(如果需要的话) eval "${MYMODULE[get_date]}"
关键细节说明
eval "declare -A $1":因为我们要创建的数组名称是通过参数传入的,所以必须用eval来动态执行声明命令,否则无法直接用变量名创建数组。source "$2":加载模块脚本后,模块里的EXPORTS数组会被加载到当前Shell会话中,这样import函数才能遍历它。- 遍历
EXPORTS时用eval赋值:同样是因为目标数组的名称是动态的,需要eval来完成动态赋值操作。
内容的提问来源于stack exchange,提问作者fizzydrinks
相关产品推荐
相关产品推荐

