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
关键说明
- 参数顺序修正:
beginswith函数的逻辑是检查第二个参数是否以第一个参数开头,所以必须把要匹配的前缀(test_)放在第一个参数的位置。 - 避免函数调用:只要你始终用双引号包裹
${func}作为参数传递,就只会传递字符串形式的函数名,不会触发函数执行。如果你的场景中确实出现了函数被调用的情况,排查代码中是否存在直接执行${func}的语句(比如单独一行写${func}),把这类代码改为参数传递形式即可。
内容的提问来源于stack exchange,提问作者dubbaluga
相关产品推荐
相关产品推荐

