在Bash函数名中使用变量:替代eval的安全方案问询
在PKGBUILD中替代eval创建含变量名的函数
在Bash环境下,避免使用eval创建名称含变量的函数,可以采用以下两种安全方案,彻底规避代码注入风险:
方案一:模板函数+包装函数
先定义通用的模板逻辑,再为每个包名创建对应的包装函数,通过declare -f动态生成函数:
pkgname=(pkg{1,2,3}) # 定义通用处理逻辑的模板函数 _package_template() { local target_pkg="$1" [ "$target_pkg" = pkg1 ] && echo "$target_pkg specific stuff" [ "$target_pkg" = pkg2 ] && echo "$target_pkg specific stuff" [ "$target_pkg" = pkg3 ] && echo "$target_pkg specific stuff" echo "common stuff" echo "common stuff" } # 为每个包名生成专属函数 for pkg in "${pkgname[@]}"; do declare -f "package_$pkg"=$(printf '_package_template "%s"' "$pkg") done # 调用测试 package_pkg1 package_pkg2 package_pkg3
方案二:循环内捕获变量的函数定义
利用Bash的局部变量特性,在循环内直接定义函数时捕获当前包名,避免变量值被后续循环覆盖:
pkgname=(pkg{1,2,3}) for pkg in "${pkgname[@]}"; do # 定义专属函数,用局部变量固定当前循环的包名 package_$pkg() { local current_pkg="$pkg" [ "$current_pkg" = pkg1 ] && echo "$current_pkg specific stuff" [ "$current_pkg" = pkg2 ] && echo "$current_pkg specific stuff" [ "$current_pkg" = pkg3 ] && echo "$current_pkg specific stuff" echo "common stuff" echo "common stuff" } done # 调用测试 package_pkg1 package_pkg2 package_pkg3
预期输出
两种方案执行后都会得到以下结果:
pkg1 specific stuff common stuff common stuff pkg2 specific stuff common stuff common stuff pkg3 specific stuff common stuff common stuff
安全说明
- 避免了
eval拼接字符串执行的风险,即使pkgname中包含空格、引号等特殊字符,也不会触发代码注入。 - 方案一的模板函数更易于维护,通用逻辑只需修改一次;方案二更直观,适合简单场景。
内容的提问来源于stack exchange,提问作者myself600
相关产品推荐
相关产品推荐

