获取shell脚本中的函数名称列表[重复]

2024-10-31 08:38:00
admin
原创
64
摘要:问题描述:我有一个 Bourne Shell 脚本,其中有几个函数,可以按以下方式调用:my.sh <func_name> <param1> <param2> 在里面,func_name()将被param1和调用param2。我想创建一个help函数...

问题描述:

我有一个 Bourne Shell 脚本,其中有几个函数,可以按以下方式调用:

my.sh <func_name> <param1> <param2>

在里面,func_name()将被param1和调用param2

我想创建一个help函数,它只列出所有可用的函数,甚至没有参数。

问题:如何从脚本内部获取脚本中所有函数名称的列表?

我希望避免解析它并寻找函数模式。太容易出错了。

更新:代码。希望我的help()功能是这样的main()- 添加到代码中的功能会自动添加到帮助中。

#!/bin/sh

# must work with "set -e"

foo ()
{
    echo foo: -$1-$2-$3-
    return 0
}

# only runs if there are parameters
# exits
main ()
{
    local cmd="$1"
    shift
    local rc=0
    $cmd "$@" || rc=$?
    exit $rc
}

if [[ "$*" ]]
then
    main "$@"
    die "how did we get here?"
fi

解决方案 1:

您可以在自己的脚本上使用 grep 命令来获取脚本中的函数列表。为了使此方法有效,您需要以某种方式构造函数,以便 grep 可以找到它们。以下是示例:

$ cat my.sh
#!/bin/sh

function func1() # Short description
{
    echo func1 parameters: $1 $2
}

function func2() # Short description
{
    echo func2 parameters: $1 $2
}

function help() # Show a list of functions
{
    grep "^function" $0
}

if [ "_$1" = "_" ]; then
    help
else
    "$@"
fi

以下是一个交互式演示:

$ my.sh 
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions


$ my.sh help
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions


$ my.sh func1 a b
func1 parameters: a b

$ my.sh func2 x y
func2 parameters: x y

如果您有不想在帮助中显示的“私有”功能,请省略“功能”部分:

my_private_function()
{
    # Do something
}

解决方案 2:

typeset -f返回函数及其函数体,因此使用一个简单的 awk 脚本来提取函数名称

f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
    echo "functions available:"
    typeset -f | awk '/ () $/ && !/^main / {print $1}'
}
main () { help; }
main

该脚本输出:

functions available:
f1
f2
f3
f4
help

解决方案 3:

您调用此函数时不带任何参数,它仅会输出由“空格”分隔的函数名称列表。


function script.functions () {
    local fncs=`declare -F -p | cut -d " " -f 3`; # Get function list
    echo $fncs; # not quoted here to create shell "argument list" of funcs.
}

要将函数加载到数组中:


declare MyVar=($(script.functions));

当然,常识告诉我们,任何在调用此函数之前尚未放入当前文件的函数都不会显示在列表中。

要使列表只读并可供导出到由此脚本调用的其他脚本:


declare -rx MyVar=($(script.functions));

要以换行符分隔的方式打印整个列表:


printf "%s
" "${MyVar[@]}";

解决方案 4:

最好的做法是创建一个数组(使用 bash),其中包含您想要宣传的函数,然后让您的帮助函数对其进行迭代并打印。

单独调用set将产生函数,但会完整地产生。您仍然需要解析它以查找以 () 结尾的内容以获取众所周知的符号

使用类似的东西来getopt转换--function-namefunction_name带参数的可能也更明智。但是,好吧,理智是相对的,而且你还没有发布代码:)

您的另一个选择是创建一个可加载的 bash( 的一个分支set)来完成此任务。老实说,我更喜欢先进行解析,然后再为这个任务编写可加载的程序。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用