GNU/Linux >> Znalost Linux >  >> Linux

Získejte seznam názvů funkcí ve skriptu shellu

typeset -f vrací funkce s jejich těly, takže k odstranění názvů funkcí se používá jednoduchý skript awk

f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
    echo "functions available:"
    typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
main () { help; }
main

Výstup tohoto skriptu:

functions available:
f1
f2
f3
f4
help

Tuto funkci zavoláte s noargumenty a vyplivne pouze seznam názvů funkcí oddělený "bílými znaky".

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.
}

Načtení funkcí do pole:

declare MyVar=($(script.functions));

Zdravý rozum samozřejmě velí, že žádné funkce, které nebyly zapsány do aktuálního souboru před jeho voláním, se v seznamu nezobrazí.

Chcete-li, aby byl seznam pouze pro čtení a byl k dispozici pro export do jiných skriptů vyvolaných tímto skriptem:

declare -rx MyVar=($(script.functions));

Chcete-li vytisknout celý seznam jako nový řádek:

printf "%s\n" "${MyVar[@]}";

Seznam funkcí ve vašem skriptu můžete získat pomocí příkazu grep ve vašem vlastním skriptu. Aby tento přístup fungoval, budete muset své funkce určitým způsobem strukturovat, aby je grep mohl najít. Zde je ukázka:

$ 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

Zde je interaktivní demo:

$ 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

Pokud máte „soukromou“ funkci, kterou nechcete v nápovědě zobrazovat, pak část „funkce“ vynechejte:

my_private_function()
{
    # Do something
}

Nejlepší věc, kterou můžete udělat, je vytvořit pole (používáte bash), které obsahuje funkce, které chcete inzerovat, a nechat si je pomocí funkce nápovědy iterovat a vytisknout.

Volání set sám vytvoří funkce, ale v jejich celistvosti. Stále byste museli analyzovat hledání věcí končících na (), abyste získali pověstné symboly .

Je také pravděpodobně rozumnější použít něco jako getopt pro otočení --function-name do function_name s argumenty. Ale rozumný je relativní a kód jste neposlali :)

Další možností je vytvořit načítatelný soubor pro bash (fork set ), který to splňuje. Upřímně řečeno, raději bych šel s analýzou před psaním načítatelného pro tento úkol.


Linux
  1. Jak získat externí IP adresu ve skriptu Shell?

  2. Shell skript s funkcí a parametrem jako proměnnými?

  3. Funkce v proměnných Shell?

  1. Jak používat funkce shellu příkazového řádku v Linuxu

  2. Získat využití CPU v shell skriptu?

  3. Aktuální adresář skriptu Shell?

  1. Jak definovat a používat funkce v Linux Shell Script

  2. Získejte MAC adresu pomocí shell skriptu

  3. Získejte názvy funkcí ve sdílené knihovně programově