2016-06-21 4 views
0

Ich möchte mein Array an den Benutzer ausgeben, damit sie sehen können, wie die Zuordnungen aussehen würden. Ich versuchte so mit dieser Aussage printf '%s\n' "${cluster_to_endpoint[@]}" Ich versuche, es in meiner Nutzungsfunktion unten zu entleeren, aber ich bekomme nicht die Ausgabe, die ich erwarte.Bash - Wie alle Elemente in Array innerhalb der Verwendung dump

-Code in progress:

#!/bin/bash 

set -e 

usage() { 
    echo "Usage: $0 -o oldcluster -n newcluster" 
    printf '%s\n' "${cluster_to_endpoint[@]}" 
} 

while getopts ":o:n:" opt; do 
    case $opt in 
    o) old="$OPTARG";; 
    n) new="$OPTARG";; 
    *) usage 
     exit 1 
     ;; 
    esac 
done 


# Mapping 
declare -A cluster_to_endpoint=(
     [c1]=foobar2-01.us-east-1.my.com 
     [c2]=foobar2-02.us-east-1.my.com 
     [c3]=foobar2-03.us-east-1.my.com 
     [c4]=foobar2-04.us-east-1.my.com) 

# Echo info 
echo "Source cluster:${cluster_to_endpoint[$old]}" 
echo "Target cluster:${cluster_to_endpoint[$new]}" 

Ausgang:

-bash-4.1$ ./tst.sh -h 
Usage: ./tst.sh -o oldcluster -n newcluster 

Erwartet:

Usage: ./tst.sh -o oldcluster -n newcluster 

    [c1]=foobar2-01.us-east-1.my.com 
    [c2]=foobar2-02.us-east-1.my.com 
    [c3]=foobar2-03.us-east-1.my.com 
    [c4]=foobar2-04.us-east-1.my.com 
+4

Sie hätten eine bessere Chance, die erwartete Ausgabe zu erhalten, wenn Sie das Array erstellen * bevor * Sie versuchen, es zu drucken. – rici

Antwort

3

Der Code wird von oben nach unten ausgeführt, und wenn er in die while-Schleife eintritt, wird die Verwendung aufgerufen, die versucht, das Array zu drucken, es wurde jedoch noch nicht initialisiert.

Setzen Sie die declare-Anweisung vor jedem Zugriff darauf.

1

Sie Ihre usage Shell-Funktion aufrufen, bevor das Array cluster_to_endpoint initialisiert.

Verschieben Sie die declare-Anweisung vor der Behandlung der Befehlszeile.

Darüber hinaus müssen die Indizes in einem Array zu Integer-Werten ausgewertet werden und daher nicht c1 usw. sein, wie Sie haben. EDIT Anscheinend ist dies, wie Sie assoziative Arrays in Bash Version 4+ tun. Ältere Bash muss gewöhnliche Arrays (declare -a) mit ganzzahligen Indizes verwenden.

+0

'declare -A' deklariert ein assoziatives Array in Bash 4+. Sie sind von Strings getastet. –

+0

Das stimmt, ich habe vergessen zu sagen, dass ich zu '-a' wechseln musste für die' bash', die ich lief. Wenn es in Ihrer Version von 'bash' funktioniert, dann gehen Sie damit. Ping @noober – Kusalananda

+0

verstanden! Danke für die Hilfe – noober

Verwandte Themen