GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Holen Sie sich eine Liste von Funktionsnamen in einem Shell-Skript

typeset -f gibt die Funktionen mit ihren Körpern zurück, also wird ein einfaches awk-Skript verwendet, um die Funktionsnamen auszulesen

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

Dieses Skript gibt Folgendes aus:

functions available:
f1
f2
f3
f4
help

Sie rufen diese Funktion ohne Argumente auf und sie spuckt nur eine durch "Leerzeichen" getrennte Liste von Funktionsnamen aus.

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

Um die Funktionen in ein Array zu laden:

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

Natürlich diktiert der gesunde Menschenverstand, dass alle Funktionen, die nicht in die aktuelle Datei aufgenommen wurden, bevor diese aufgerufen wird, nicht in der Liste auftauchen.

So machen Sie die Liste schreibgeschützt und für den Export in andere Skripts verfügbar, die von diesem Skript aufgerufen werden:

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

So drucken Sie die gesamte Liste als durch Zeilenumbrüche getrennt:

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

Sie können eine Liste der Funktionen in Ihrem Skript abrufen, indem Sie den grep-Befehl in Ihrem eigenen Skript verwenden. Damit dieser Ansatz funktioniert, müssen Sie Ihre Funktionen auf eine bestimmte Weise strukturieren, damit grep sie finden kann. Hier ist ein Beispiel:

$ 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

Hier ist eine interaktive 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

Wenn Sie eine „private“ Funktion haben, die nicht in der Hilfe angezeigt werden soll, lassen Sie den Teil „Funktion“ weg:

my_private_function()
{
    # Do something
}

Das Beste, was Sie tun können, ist, ein Array zu erstellen (Sie verwenden Bash), das Funktionen enthält, die Sie ankündigen möchten, und Ihre Hilfefunktion iterieren und sie drucken lassen.

Anruf set allein erzeugt die Funktionen, aber in ihrer Gesamtheit. Sie müssten das immer noch analysieren, indem Sie nach Dingen suchen, die auf () enden, um die sprichwörtlichen Symbole zu erhalten .

Es ist wahrscheinlich auch vernünftiger, so etwas wie getopt zu verwenden um --function-name zu drehen in function_name mit Argumenten. Aber gesund ist relativ und du hast keinen Code gepostet :)

Ihre andere Möglichkeit besteht darin, ein Loadable für Bash zu erstellen (ein Fork von set ), das dies bewirkt. Ehrlich gesagt würde ich es vorziehen, mit Parsing zu beginnen, bevor ich ein Loadable für diese Aufgabe schreibe.


Linux
  1. Zeitüberschreitung in einem Shell-Skript?

  2. Shell-Skript mit Funktion und Parameter als Variablen?

  3. Funktionen in Shell-Variablen?

  4. So verwenden Sie Befehlszeilen-Shell-Funktionen in Linux

  5. Rufen Sie die MAC-Adresse mit Shell-Skript ab

Bash-Funktionen

Shell-Scripting Teil V:Funktionen in Bash

Tutorial zu Bash-Shell-Funktionen mit 6 praktischen Beispielen

Holen Sie sich eine bestimmte Zeile aus einer Textdatei, indem Sie nur ein Shell-Skript verwenden

Rufen Sie Namen und Adressen von exportierten Funktionen in Linux ab

Wie kann ich meine externe IP-Adresse in einem Shell-Skript abrufen?