it-swarm.com.de

Veränderliche Listen- oder Arraystruktur in Bash? Wie kann ich es leicht hinzufügen?

Ich versuche, String-Werte in einem Bash-Skript zu sammeln. Wie kann ich am einfachsten String-Werte an eine Listen- oder Array-Struktur anhängen, so dass ich sie am Ende ausdrücken kann?

48
Joe
$ arr=(1 2 3)
$ arr+=(4)
$ echo ${arr[@]}
1 2 3 4

Da Bash spärliche Arrays verwendet, sollten Sie das Element count ${#arr} nicht als Index verwenden. Sie können jedoch ein Array von Indizes wie folgt erhalten:

$ indices=(${!arr[@]})
88
foo=(a b c)
foo=("${foo[@]}" d)
for i in "${foo[@]}"; do echo "$i" ; done
$ for i in "string1" "string2" "string3"
> do
> array+=($i)
> done
$ echo ${array[@]}
string1 string2 string3
2
ghostdog74

Die eher obskure Syntax zum Anhängen an das Ende eines Arrays in Bash lautet:

myarr[${#myarr[*]}]=”$newitem”
2
ennuikiller

Um dem hinzuzufügen, was Ignacio in einer anderen Antwort vorgeschlagen hat:

foo=(a b c)
foo=("${foo[@]}" d) # Push element 'd'

foo[${#foo[*]}]="e" # Push element 'e'

for i in "${foo[@]}"; do echo "$i" ; done
2
codaddict

Obwohl die Frage bereits beantwortet wurde und ziemlich alt ist, möchte ich eine Namespace-Lösung freigeben, da sie wesentlich schneller arbeitet als jede andere Methode, mit Ausnahme der Antwort von ennukiller (bei meinen Tests mit 100.000 Zeilen gewann sie ~ 12 Sekunden gegen meine ~ 14 Sekunden, wohingegen die Listenanfügungslösung einige Minuten dauern würde).

Sie können den folgenden Trick verwenden:

# WORKS FASTER THAN THESE LAME LISTS! ! !
size=0;while IFS= read -r line; do
    echo $line
    ((++size))
    eval "SWAMP_$size='$line'"
done

Oder Sie können Folgendes tun:

#!/bin/bash
size=0
namespace="SWAMP"

ArrayAppend() {
    namespace="$1"
    # suppose array size is global
    new_value="$2"
    eval "${namespace}_$size='$2'"
    eval "echo \$${namespace}_$size"
    ((++size))
}

ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"

Solange sich der Interpreter in der Tag-Liste befindet, ist hier ein Link für objectorientierte bash .

0
theoden