Bash unterstützt die direkte Rückgabe von Arrays aus Funktionen nicht. Mit geschickten Techniken lässt sich dies jedoch erreichen. Dieser Artikel beschreibt zwei effektive Methoden: die Verwendung von Kommando-Substitution und die Manipulation des Internal Field Separator (IFS).
Inhaltsverzeichnis
- Kommando-Substitution
- Arrays mit Kommando-Substitution zurückgeben
- Arrays mit IFS zurückgeben
- Die beste Methode auswählen
Kommando-Substitution
Kommando-Substitution erfasst die Ausgabe eines Befehls und weist sie einer Variablen zu. Dies bildet die Grundlage unserer ersten Methode. Der Schlüssel liegt darin, die Ausgabe der Funktion für das einfache Parsen zurück in ein Array zu formatieren.
Arrays mit Kommando-Substitution zurückgeben
Diese Methode beinhaltet das Verbinden von Array-Elementen zu einer Zeichenkette mit einem Trennzeichen und das anschließende Aufteilen der Zeichenkette zurück in ein Array. Sehen wir uns ein Beispiel an:
my_array_function() {
local array=("apple" "banana" "cherry")
local delimiter="|"
echo "${array[*]}" | tr ' ' 'n' | paste -sd"$delimiter" -
}
returned_string=$(my_array_function)
returned_array=(${returned_string//|$delimiter/ })
echo "Zurückgegebenes Array: ${returned_array[@]}"
So funktioniert es:
my_array_function
erstellt ein lokales Array.- Es verwendet
echo
,tr
um Leerzeichen durch Zeilenumbrüche zu ersetzen undpaste
um die Elemente mit dem Trennzeichen zu verbinden. - Kommando-Substitution erfasst die Ausgabe in
returned_string
. - Parametererweiterung ersetzt das Trennzeichen durch Leerzeichen, um das Array
returned_array
zu erstellen.
Dieser Ansatz ist einfach und effektiv, aber das Trennzeichen darf nicht in den Array-Elementen vorkommen. Wenn dies der Fall ist, sollten Sie ein weniger gebräuchliches Zeichen oder eine robustere Methode zur Behandlung von Trennzeichen verwenden.
Arrays mit IFS zurückgeben
Der Internal Field Separator (IFS) steuert, wie Bash Zeichenketten in Wörter aufteilt. Wir können dies nutzen, um Arrays zurückzugeben, indem wir IFS innerhalb der Funktion setzen und Array-Elemente ausgeben. Das aufrufende Skript verwendet dann das modifizierte IFS, um die Ausgabe zu parsen.
my_array_function() {
local array=("apple" "banana" "cherry")
local old_ifs="$IFS"
IFS=$'n'
printf "%sn" "${array[@]}"
IFS="$old_ifs"
}
returned_array=($(my_array_function))
echo "Zurückgegebenes Array: ${returned_array[@]}"
Erläuterung:
my_array_function
speichert das aktuelle IFS.- Es setzt IFS auf ein Zeilenumbruchzeichen.
- Es gibt jedes Array-Element in einer neuen Zeile aus.
- Es stellt IFS wieder her.
- Das aufrufende Skript verwendet den Zeilenumbruch als Trennzeichen, um das Array zu erstellen.
Diese Methode ist sauberer, wenn Ihre Array-Elemente keine Zeilenumbrüche enthalten. Für Elemente mit Zeilenumbrüchen müssen Sie ein anderes, weniger wahrscheinliches IFS-Zeichen wählen.
Die beste Methode auswählen
Beide Methoden bieten praktikable Lösungen. Die beste Wahl hängt von Ihren spezifischen Bedürfnissen und den Array-Inhalten ab. Der Ansatz der Kommando-Substitution bietet mehr Flexibilität bei der Auswahl des Trennzeichens, während die Verwendung von IFS sauberer sein kann, wenn Ihre Daten dies zulassen. Priorisieren Sie immer sauberen, robusten und gut kommentierten Code.