Ich habe zwei Arrays:
arrayA=(1 2 3)
arrayB=(a b c)
und ich möchte einen von ihnen mit einem Befehlszeilenargument ausdrucken, dh ohne if else
.
Ich habe einige Variationen der Syntax ohne Erfolg ausprobiert. Ich möchte so etwas tun:
ARG="$1"
echo ${array${ARG}[@]}
Ich erhalte jedoch den Fehler "schlechte Substitution". Wie kann ich das erreichen?
Antworten:
Versuchen Sie Folgendes:
HINWEIS
man bash
(Parametererweiterung):quelle
!
macht man vor dervar
Variablen? Wie funktioniert das? Es schien ein Ersatz für die Geschichte beim Googeln zu sein, aber ich konnte nicht sehen, wie das hier funktionierte.Während Sie den indirekten Zugriff wie in einer anderen Antwort angegeben verwenden können , besteht eine andere Möglichkeit (in ksh und Bash 4.3 und neuer) darin, namerefs zu verwenden. Insbesondere bei Arrays kann dies nützlicher sein, da Sie das Array über den Namen indizieren können und den Index nicht in die als Referenz verwendete Variable einfügen müssen.
Dies funktioniert nicht über den indirekten Zugriff:
Wie ein C-Programmierer es ausdrücken könnte, verhält sich
${!q[1]}
hier so, als wäreq
es ein Array von Zeigern, anstatt ein Zeiger auf ein Array zu sein.quelle
Hinweis: Escape Cotes bei Platz !
quelle
Dies erforderte viel Versuch und Irrtum, funktionierte aber schließlich.
Ich habe mich von Youness inspirieren lassen. Aber alle anderen Antworten haben bei meiner alten Bash nicht geholfen (suse11sp1 [3.2.51 (1) -release])
Die 'for'-Schleife hat sich geweigert, das indirekte Array zu erweitern. Stattdessen müssen Sie es vorab erweitern und damit ein weiteres Array mit Ihrem neuen Variablennamen erstellen. Mein Beispiel unten zeigt eine Doppelschleife, da dies meine beabsichtigte Verwendung ist.
Ich benutze #, um "New_" aus dem ersten Array-Eintrag zu löschen und dann mit "things" zu verketten, um "FOOthings" zu erhalten. \ $ {} mit echo und eval, dann mache ihre Sache in der richtigen Reihenfolge, ohne Fehler zu werfen, die in ein neues $ () eingeschlossen und mit dem neuen Variablennamen versehen werden.
UPDATE ##### 2018/06/07Ich habe kürzlich einen weiteren Dreh zu diesem Thema entdeckt. Die erstellte Variable ist eigentlich kein Array, sondern eine durch Leerzeichen getrennte Zeichenfolge. Für die obige Aufgabe war dies in Ordnung, da "for" das Array nicht liest, es erweitert und dann durchlaufen wird, siehe Auszug unten:
Aber ich musste es dann als Array verwenden. Dazu musste ich noch einen Schritt ausführen. Ich habe wörtlich Code von Dennis Williamson genommen . Ich habe es getestet und es funktioniert gut.
Das "IFS = ','" ist eine Variable, die Ihren Begrenzer enthält. "read" mit "-a" schneidet und führt den Stich zurück in die Array-Variable. Beachten Sie, dass dies keine Berücksichtigung von Anführungszeichen hat, aber es gibt einige Optionen beim Lesen , um dies zu verwalten, z. B. habe ich das Flag -r entfernt, das ich nicht benötigte. Daher habe ich diesen Zusatz jetzt in der Variablenerstellung kombiniert, sodass die Daten so behandelt und adressiert werden können, wie sie sollten.
quelle
auf keinen Fall :(
Wenn Ihre Arrays so einfach sind, verwenden Sie assoziative Arrays
Wenn Ihre Arrays (zum Beispiel
array=( "a b" c )
) komplizierter sind, würde das leider nicht funktionieren. Dann müssen Sie sich einen anderen Weg überlegen, um Ihr Ziel zu erreichen.quelle
Verwenden
eval
quelle
Auf diese Weise würden Sie eine dynamisch benannte Variable erstellen (Bash-Version <4.3).
Im Folgenden finden Sie eine Gruppe von Funktionen, mit denen dynamisch benannte Arrays verwaltet werden können (Bash-Version <4.3).
Im Folgenden finden Sie eine Gruppe von Funktionen, mit denen dynamisch benannte Arrays verwaltet werden können (Bash-Version> = 4.3).
Weitere Informationen zu diesen Beispielen finden Sie unter Getting Bashed by Dynamic Arrays von Ludvik Jerabek
quelle