2016-03-20 34 views
4

Ich habe Probleme zu verstehen, wie globale Variablen effektiv zu verwenden. Aus meinem Verständnis von Bash ist jede Variable global, es sei denn, sie wurde explizit als lokal deklariert, wie folgt: http://tldp.org/LDP/abs/html/localvar.html. So war mein Verständnis, wenn ich eine Funktion wie diese baue:Bash - Rückgabe Array von Funktion

# This function will determine which hosts in network are up. Will work only with subnet /24 networks 
is_alive_ping() # Declare the function that will carry out given task 
{ 
    # declare a ip_range array to store the range passed into function 
    declare -a ip_range=("${!1}") 

    # declare active_ips array to store active ip addresses 
    declare -a active_ips 

    for i in "${ip_range[@]}" 
    do 
    echo "Pinging host: " $i 
    if ping -b -c 1 $i > /dev/null; then # ping ip address declared in $1, if succesful insert into db 

     # if the host is active add it to active_ips array 
     active_ips=("${active_ips[@]}" "$i") 
     echo "Host ${bold}$i${normal} is up!" 

    fi 
    done 
} 

ich soll in der Lage sein, den Zugang zu den active_ips Variable zu erhalten, sobald der Anruf an is_alive_ping Funktion aufgerufen wurde. Wie so:

# ping ip range to find any live hosts 
is_alive_ping ip_addr_range[@] 
echo ${active_ips[*]} 

Dies wurde durch diese Frage in Stackoverflow verstärkt: Bash Script-Returning array from function. Mein Echo für das Array active_ips gibt jedoch nichts zurück. Das ist überraschend für mich, weil ich weiß, dass das Array tatsächlich einige IPs enthält. Irgendwelche Ideen, warum das scheitert?

Antwort

3

declare erstellt lokale Variablen. Verwenden Sie declare -g, um sie global zu machen, oder überspringen Sie einfach das Schlüsselwort declare.

active_ips+=("$i") 
+0

Vielen Dank für die schnelle Antwort:

declare -ga active_ips # or active_ips=() 

Sie können aber auch mit += zu Array anhängen! Ich werde es versuchen – NSaid