2013-11-02 6 views
11

Es tut uns so unschuldige Frage - Ich versuche einfach zu undertand ...Warum werden "declare -f" und "-dea -a" in Bash-Skripten benötigt?

Zum Beispiel - ich habe:

$ cat test.sh 
#!/bin/bash 
declare -f testfunct 

testfunct() { 
echo "I'm function" 
} 

testfunct 

declare -a testarr 

testarr=([1]=arr1 [2]=arr2 [3]=arr3) 

echo ${testarr[@]} 

Und wenn ich es benutze ich:

$ ./test.sh 
I'm function 
arr1 arr2 arr3 

hier also ist eine frage - wofür muss ich (wenn muss ...) declare hier einfügen? Mit ihm - oder ohne es funktioniert es gleich ...

kann ich zum Beispiel declare -i var oder declare -r var verstehen. Aber was ist -f (Funktion deklarieren) und -a (Array deklarieren)?

Danke für Tipps und Links.

+1

Die häufigste Verwendung von 'declare' innerhalb von Funktionen ist, wo es die gleiche wie' local' verhält, wenn keine Flaggen gegeben. Es kann auch für einige Datentypen erforderlich sein, d. 'declare -A' für assoziative Arrays. 'declarieren -g' ist oft ein nützliches Feature, wenn man es einem Leser ganz explizit machen will, dass man sich * absichtlich * auf ein globales Innere einer Funktion bezieht, anstatt zu vergessen, es zu deklarieren und implizit global zu machen. –

Antwort

12

declare -f functionname zur Ausgabe der Definition der Funktion functionname verwendet wird, wenn es vorhanden ist, und absolut nicht zu erklären dass functionname ist/wird eine Funktion sein. Schauen Sie:

$ unset -f a # unsetting the function a, if it existed 
$ declare -f a 
$ # nothing output and look at the exit code: 
$ echo $? 
1 
$ # that was an "error" because the function didn't exist 
$ a() { echo 'Hello, world!'; } 
$ declare -f a 
a() 
{ 
    echo 'Hello, world!' 
} 
$ # ok? and look at the exit code: 
$ echo $? 
0 
$ # cool :) 

Also in Ihrem Fall declare -f testfunct wird nichts tun, außer vielleicht, wenn testfunct vorhanden ist, gibt er seine Definition auf stdout.

5

declare -f können Sie alle definierten Funktionen (oder Quellen) und deren Inhalte auflisten.

Beispiel:

[ ~]$ cat test.sh 
#!/bin/bash 

f(){ 
    echo "Hello world" 
} 

# print 0 if is defined (success) 
# print 1 if isn't defined (failure) 
isDefined(){ 
    declare -f "$1" >/dev/null && echo 0 || echo 1 
} 

isDefined f 
isDefined g 
[ ~]$ ./test.sh 
0 
1 
[ ~]$ declare -f 
existFunction() 
{ 
    declare -f "$1" > /dev/null && echo 0 || echo 1 
} 
f() 
{ 
    echo "Hello world" 
} 

jedoch wie gesagt elegant gniourf_gniourf unten: es ist besser declare -F zu nutzen, um die Existenz einer Funktion zu testen.

+1

Um zu überprüfen, ob eine Funktion existiert, ist es wahrscheinlich besser, 'declare -F 'zu verwenden. –

+0

Ja, ich stimme zu. Ich bearbeite meinen Post :) –

4

Soweit ich weiß, hat die Option -a keine praktische Relevanz, aber ich denke, es ist ein Plus für die Lesbarkeit beim Deklarieren von Arrays. Es wird interessanter, wenn es mit anderen Optionen kombiniert wird, um Arrays eines speziellen Typs zu erzeugen.

Zum Beispiel:

# Declare an array of integers 
declare -ai int_array 

int_array=(1 2 3) 

# Setting a string as array value fails 
int_array[0]="I am a string" 

# Convert array values to lower case (or upper case with -u) 
declare -al lowercase_array 

lowercase_array[0]="I AM A STRING" 
lowercase_array[1]="ANOTHER STRING" 

echo "${lowercase_array[0]}" 
echo "${lowercase_array[1]}" 

# Make a read only array 
declare -ar readonly_array=(42 "A String") 

# Setting a new value fails 
readonly_array[0]=23 
+0

Anscheinend '-l' und' -u' sind nur bash 4+. – Kevin