#!/usr/bin/env bashgreet(){# Call the _hello function,# passing the value of the $__name variable._hello"$__name"}_extract_comments(){awk"/^${1} *\(\) *{/{flag=1;next}/^}/{flag=0}flag""$0"|awk'/^ *#/{sub(/^ *# ?/, ""); print; next} {exit}'}_extract_commentsgreet
を実行すれば
123
$ ./greet.sh
Call the _hello function,
passing the value of the $__name variable.
先頭からの連続コメント行だけを見るので、
123456
greet(){# Call the _hello function,# passing the value of the $__name variable._hello"$__name"}
のように一行開けると何も取れなくなります。
また、
1234567
greet(){# Call the _hello function,# passing the value of the $__name variable.# This is ignored_hello"$__name"}
#!/usr/bin/env bash# Default parameters__name="Alice"# Non sub command_hello(){echo"hello $1!"}# sub commandsgreet(){# Call the _hello function,# passing the value of the $__name variable._hello"$__name"}commands(){# Show subcommands.echo"$__subcommands"}_print_explain(){localvalue="$1"localspaces="$2"localname_length="$3"localcomments="$4"localprefix=$(printf"%${spaces}s%-${name_length}s%s\n""""$value ")whileIFS=read-rline;doprintf"%s%s\n""$prefix""$line"prefix="${prefix//?/ }"done<<<"$comments"}_extract_comments(){awk"/^${1} *\(\) *{/{flag=1;next}/^}/{flag=0}flag""$0"|awk'/^ *#/{sub(/^ *# ?/, ""); print; next} {exit}'}_print_subcommands(){echo"Subcommands:"forfuncin$__subcommands;dolocalcomments=$(_extract_comments"$func")_print_explain"$func"235"$comments"done}help(){# Show this help.echo"Usage $0 <subcommand> [options]"echo""_print_subcommands
}# Make sub command list__subcommands=$(set|grep-v"^_"|grep-v"^ "|grep" () $"|cut-d' '-f1|tr'\n'' ')# Start mainif[$#-eq0];thenhelpfi# Check sub command__subcommand="$1"shiftif!echo" $__subcommands "|grep-q" $__subcommand ";thenecho"$__subcommand is unknown subcommand."echo""helpexit1fi# Get other argumentswhilegetoptsn:hOPT;docase$OPTin"n")__name="$OPTARG";;"h")help;exit0;;*)echo"Unknown argument: $OPT";echo;help;exit1;;esacdone# Run sub command$__subcommand
追加されたのは以下の関数。
_print_explain
第一引数に関数名。
第二引数に表示のインデントのスペース数。
第三引数に関数名の表示幅(説明文の開始を揃えるため。左詰め)。
第四引数にコメント。
_extract_comments
関数名を引数に取り、その関数のコメントを取得する。
_print_subcommands
サブコマンドの一覧を表示する。
で、helpの中で_print_subcommandsを呼んでいます。
これで、
12345678
$ ./my_command.sh
Usage ./my_command.sh <subcommand> [options]
Subcommands:
commands Show subcommands.
greet Call the _hello function,
passing the value of the $__name variable.
help Show this help.