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

2024-10-31 08:38:00
admin
原创
186
摘要:问题描述:我有一个 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用