GNU/Linux >> Linux の 問題 >  >> Linux

シェル スクリプトで関数名のリストを取得する

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[@]}";

独自のスクリプトで 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
    "[email protected]"
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
}

最善の方法は、アドバタイズしたい関数を含む配列 (bash を使用している) を作成し、ヘルプ関数を反復して出力することです。

set を呼び出す 単独で関数が生成されますが、その全体が生成されます。ことわざのシンボルを取得するには、() で終わるものを探して解析する必要があります。 .

getopt のようなものを使用することもおそらく賢明です --function-name を回す function_name に 引数付き。しかし、まあ、正気は相対的であり、コードを投稿していません:)

もう 1 つのオプションは、bash 用のローダブル (set のフォーク) を作成することです。 ) これを実現します。正直なところ、このタスク用にローダブルを作成する前に解析を行いたいと思います.


Linux
  1. 独自のIPアドレスを取得し、シェルスクリプトの変数に保存する方法は?

  2. 関数とパラメータを変数として持つシェルスクリプト?

  3. シェル変数の関数?

  1. Linux でコマンド ライン シェル関数を使用する方法

  2. ファイル名に先行ゼロを追加する Linux シェル スクリプト

  3. シェルスクリプトの現在のディレクトリ?

  1. シェルスクリプトで外部IPアドレスを取得する方法は?

  2. シェルスクリプトでタイムアウトしますか?

  3. シェル スクリプトを使用して MAC アドレスを取得する