You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中如何引用变量内的字符串函数名而不触发调用?

问题解决:引用Bash函数名不触发调用并正确匹配前缀

你的代码核心问题是beginswith函数的参数顺序搞反了,同时明确一点:在Bash里用双引号包裹变量(如"${func}")只会传递函数名的字符串值,绝对不会触发函数调用——只有当你把变量直接当命令执行(比如写${func}而不是作为参数传递)时,才会调用对应的函数。

修正后的代码

基础修正版(解决参数顺序问题)

beginswith() { case "$2" in "$1"*) true;; *) false;; esac; }

get_test_funcs() {
    for func in $(declare -F | awk '{print $3}'); do
        # 把前缀"test_"放在第一个参数位置,函数名作为第二个参数
        if beginswith "test_" "${func}"; then
            echo "${func}"
        fi
    done
}

get_test_funcs

更严谨的版本(处理特殊函数名)

如果你的函数名包含空格或特殊字符,用while read循环替代for循环可以避免字段分割的问题:

beginswith() { case "$2" in "$1"*) true;; *) false;; esac; }

get_test_funcs() {
    declare -F | awk '{print $3}' | while read -r func; do
        if beginswith "test_" "${func}"; then
            echo "${func}"
        fi
    done
}

get_test_funcs

关键说明

  1. 参数顺序修正:beginswith函数的逻辑是检查第二个参数是否以第一个参数开头,所以必须把要匹配的前缀(test_)放在第一个参数的位置。
  2. 避免函数调用:只要你始终用双引号包裹${func}作为参数传递,就只会传递字符串形式的函数名,不会触发函数执行。如果你的场景中确实出现了函数被调用的情况,排查代码中是否存在直接执行${func}的语句(比如单独一行写${func}),把这类代码改为参数传递形式即可。

内容的提问来源于stack exchange,提问作者dubbaluga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:37:37