2012-09-06 7 views
10

Ich versuche, ein Array, das andere Arrays enthält, durchlaufen und diese Arrays bestehen aus Zeichenfolgen mit Leerzeichen. Das Problem ist, dass ich den Abstand in der Zeichenfolge scheinbar nicht beibehalten kann. Die Zeichenfolge mit Leerzeichen werden entweder in mehrere Elemente unterteilt, wenn ich IFS ändern auf \ n oder alle Elemente des Arrays werden als 1 Artikel zu sehen, wenn ich IFS unverändert lassen hier einige Beispielcode:Loop-Array von Arrays von Zeichenfolge mit Leerzeichen

#!/bin/sh 
low1=("AA QQ" "BB LL") 
low2=("CC" "DD") 
low3=("EE" "FF") 
high=(low1 low2 low3) 

for high_item in ${high[@]} 
do 
    eval arrayz=\${$high_item[@]} 
    #IFS=$'\n' 
    for item in $arrayz 
    do 
     echo $item 
    done 
done 

Ausgang:

 
AA 
QQ 
BB 
LL 
CC 
DD 
EE 
FF 

Wie Sie sehen können, wurden die Elemente "AA QQ" und "BB LL" aufgeteilt.

Wenn ich die Zeile Kommentar-, die IFS setzt auf \n ich folgende:

 
AA QQ BB LL 
CC DD 
EE FF 

Now "AA QQ" und "BB LL" ist verketteten!

Gibt es trotzdem ich diese Elemente bewahren können, so wie sie original sind ... Ich brauche die Ausgabe so aussehen:

 
AA QQ 
BB LL 
CC 
DD 
EE 
FF 
+0

Für 'low1' haben Sie jedes Element in einer separaten Zeile. Für 'low2' und' low3' erscheinen alle Elemente in einer einzigen Zeile.Ist das beabsichtigt? – chepner

Antwort

4

eval Ersetzen durch indirekte Parameter Expansion, und Sie bekommen, was ich denken Sie wollen (obwohl es zu Ihrem aktuellen gegebenen Ausgang nicht übereinstimmt.

for high_item in "${high[@]}" 
do 
    arrayz="$high_item[@]" 
    # arrayz is just a string like "low1[@]" 
    for item in "${!arrayz}" 
    do 
     echo $item 
    done 
done 

Beachten Sie die Notwendigkeit, die Array-Erweiterung in der inneren Schleife zu zitieren, die Leerzeichen in Elementen von low1 zu erhalten

5

Ich glaube, Sie bedeuten, dass die Ausgabe sollte wie folgt aussehen:

AA QQ 
BB LL 
CC 
DD 
EE 
FF 

dh:

${low1[0]} 
${low1[1]} 
${low2[0]} 
${low2[1]} 
${low3[0]} 
${low3[1]} 

Diese Verwendung erreicht werden könnte:

#!/bin/bash 

low1=("AA QQ" "BB LL") 
low2=("CC" "DD") 
low3=("EE" "FF") 
high=(low1 low2 low3) 

for high_item in ${high[@]} 
do 
    x="${high_item}[@]" # -> "low1[@]" 
    arrays=("${!x}") 

    #IFS=$'\n' 
    for item in "${arrays[@]}" 
    do 
     echo "$item" 
    done 
done 

Und bitte immer #!/bin/bash verwenden für Bash-Skripte.

Erläuterung: ${!x} ist eine indirekte variable Erweiterung. Es wird der Wert der Variablen mit einem in $x enthaltenen Namen ausgewertet.

Für unsere Anforderungen muss x das Suffix [@] für die Array-Erweiterung haben. Besonders beachten Sie, dass es x=${high_item}[@] und nichtx=${high_item[@]} ist.

Und Sie haben bewerten Sie es in Array-Kontext; Andernfalls würde es nicht wie erwartet funktionieren (wenn Sie arrays=${!x} tun).

Ah, und als letzte Anmerkung: IFS macht hier keinen Unterschied. Solange Sie an quotierten Arrays arbeiten, kommt IFS nicht ins Spiel.

Verwandte Themen