我有一个Bourne Shell脚本,它有几个函数,并允许以下面的方式调用:
my.sh <func_name> <param1> <param2>
里面的func_name()将被调用param1和param2。
我想创build一个“帮助”function,只列出所有可用的function,即使没有参数。
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中的共享库,有没有办法在库中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 (一组叉)来完成这个任务。 说实话,我宁愿在为这个任务写入一个可加载之前解析。