获取shell脚本中的函数名称列表

我有一个Bourne Shell脚本,它有几个函数,并允许以下面的方式调用

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

里面的func_name()将被调用param1和param2。

我想创build一个“帮助”function,只列出所有可用的function,即使没有参数。

从源代码编译PHP后,仍然需要开发库?

Linux服务器中的磁盘空间

使用英特尔Quark在Linux中共享库中的非法指令

如何在Java文件系统中“漫步”

获取recursion包含在目录中的文件列表的最快方法是什么?

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

我想避免parsing它并寻找函数模式。 太容易出错。

谢谢,Alex

更新:代码。 想要我的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

简单的C代码可以在HPUX上正常工作,但是Linux上的段错误。 为什么?

Linux根据目录中的另一个文件重命名文件

关于Linux中的共享库,有没有办法在库中select导出函数

我如何执行一个任意的脚本与其目录中的工作目录?

如何从CHILD PROCESS中获得回报?

您可以通过在自己的脚本上使用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 ab func1 parameters: ab $ my.sh func2 xy func2 parameters: xy

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

my_private_function() { # Do something }

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

你可以不带任何参数地调用这个函数,它只能分出一个“空格”分隔的函数名称列表。

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 "%sn" "${MyVar[@]}";

最好的办法是做一个数组(你正在使用bash),它包含你想要做广告的函数,并让你的帮助函数迭代并打印它们。

单独调用将产生功能,但是完整。 你仍然必须解析,寻找以()结尾的事物来获得谚语符号 。

也可能更喜欢使用类似getopt function_name将--function-name变成具有参数的function_name --function-name 。 但是,理智是相对的,你没有发布代码:)

你的另一个选择是创建一个可装载的bash (一组叉)来完成这个任务。 说实话,我宁愿在为这个任务写入一个可加载之前解析。

相关文章

可以认为OpenFeign是Feign的增强版,不同的是OpenFeign支持S...
为进一步规范小程序交易生态、提升用户购物体验、满足用户在...
云原生之使用Docker部署Dashdot服务器仪表盘
本文主要描述TensorFlow之回归模型的基本原理
1.漏洞描述Apache Druid 是一个集时间序列数据库、数据仓库和...
内部类(当作类中的一个普通成员变量,只不过此成员变量是cl...