2013-11-02 10 views
11

dispiace per la domanda così innocente - ho solo cercare di undertand ...Perché "declare -f" e "declare -a" sono necessari negli script di bash?

Per esempio - ho:

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

E quando l'eseguo ottengo:

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

Così qui è una domanda - per cosa devo (se necessario ...) inserire declare qui? Con esso - o senza di esso funziona lo stesso ...

Posso capire ad esempio declare -i var o declare -r var. Ma per cosa è -f (funzione di dichiarazione) e -a (dichiarare matrice)?

Grazie per suggerimenti e collegamenti.

+1

L'uso più comune di 'declare' è all'interno di funzioni, dove si comporta equivale a' local' quando dato nessun flag. Può anche essere necessario per alcuni tipi di dati, es. 'Dichiara -A' per gli array associativi. 'declare -g' è spesso una caratteristica utile quando si vuole rendere esplicito a un lettore che * si sta * intenzionalmente * riferendosi a un global all'interno di una funzione, piuttosto che dimenticare semplicemente di dichiararlo e renderlo globale implicitamente. –

risposta

12

declare -f functionname viene utilizzato per emettere la definizione della funzione functionname, se esiste, e assolutamente non dichiarare chefunctionname è/sarà una funzione. Guardate:

$ 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 :) 

Quindi nel tuo caso, declare -f testfunct non farà nulla, tranne forse se testfunct esiste, il risultato sarà la sua definizione su stdout.

5

declare -f consente di elencare tutte le funzioni definite (o di provenienza) e il loro contenuto.

Esempio di utilizzo:

[ ~]$ 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" 
} 

Tuttavia, come detto elegantemente gniourf_gniourf seguito: è meglio usare declare -F per verificare l'esistenza di una funzione.

+1

Per verificare se esiste una funzione, probabilmente è meglio usare 'declare -F'. –

+0

Sì, sono d'accordo. Modificherò il mio post :) –

4

Per quanto ne so, l'opzione -a da sola non ha alcuna rilevanza pratica, ma penso che sia un plus per la leggibilità quando si dichiarano gli array. Diventa più interessante quando è combinato con altre opzioni per generare matrici di un tipo speciale.

Ad esempio:

# 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

Apparentemente '-l' e' -u' sono solo bash 4+. – Kevin

Problemi correlati