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

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

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

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

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

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

我想避免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 

Solutions Collecting From Web of "获取shell脚本中的函数名称列表"

您可以通过在自己的脚本上使用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 "%s\n" "${MyVar[@]}"; 

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

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

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

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