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

2024-10-31 08:38:00
admin
原创
42
摘要:问题描述:我有一个 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)来完成此任务。老实说,我更喜欢先进行解析,然后再为这个任务编写可加载的程序。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用