获取shell脚本中的函数名称列表[重复]
- 2024-10-31 08:38:00
- admin 原创
- 42
问题描述:
我有一个 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-name
成function_name
带参数的可能也更明智。但是,好吧,理智是相对的,而且你还没有发布代码:)
您的另一个选择是创建一个可加载的 bash( 的一个分支set
)来完成此任务。老实说,我更喜欢先进行解析,然后再为这个任务编写可加载的程序。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件