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

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   4077  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2785  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   103  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   124  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   107  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用