Ich versuche, Zeichenfolgenwerte in einem Bash-Skript zu sammeln. Was ist die einfachste Möglichkeit, Zeichenfolgenwerte an eine Liste oder Array-Struktur anzuhängen, sodass ich sie am Ende wiedergeben kann?
Antworten:
$ arr=(1 2 3)
$ arr+=(4)
$ echo ${arr[@]}
1 2 3 4
Da Bash spärliche Arrays verwendet, sollten Sie die Elementanzahl nicht ${#arr}
als Index verwenden. Sie können jedoch eine Reihe von Indizes wie folgt erhalten:
$ indices=(${!arr[@]})
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
Die eher obskure Syntax zum Anhängen an das Ende eines Arrays in Bash lautet:
myarr[${#myarr[*]}]=”$newitem”
Obwohl die Frage beantwortet wurde und ziemlich alt ist, möchte ich eine Namespace-Lösung teilen, da sie mit Ausnahme der Antwort von Ennukiller erheblich schneller funktioniert als alle anderen Methoden (bei meinen Tests mit 100.000 Zeilen hat sie ~ 12 Sekunden gegen meine ~ 14 gewonnen Sekunden, während die Lösung zum Anhängen von Listen 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, finden Sie hier einen Link für objektorientiertes Bash .
eval
für die Zuweisung verwenden (insbesondere bei Benutzereingaben)! Ihr Code unterliegt der Code-Injektion und ist sehr unsicher (und daher fehlerhaft)! Also ... es ist noch lamer als lahme Listen :)
.
mapfile
: mapfile -t lines < file
.
eval
sicheren Verwendung zeigen ...
mapfile
ist ein eingebauter Bash (Sie befinden sich in einer Frage, die mit Bash markiert ist ).