Wenn ich ein Array mit 5 Elementen habe, zum Beispiel:
[a][b][c][d][e]
Mit echo ${myarray[4]}
kann ich sehen, was es hält.
Aber was ist, wenn ich die Anzahl der Elemente in einem bestimmten Array nicht kenne? Gibt es eine Möglichkeit, das letzte Element eines Arrays unbekannter Länge zu lesen? dh das erste Element, das für ein Array von rechts nach links liest?
Ich würde gerne wissen, wie man das in bash macht.
$@
ist nicht gerade ein Array (kann nicht subskribiert werden). Informationen hierzu finden Sie unter Abrufen des letzten an ein Shell-Skript übergebenen Arguments .Antworten:
Sie können einfach einen negativen Index verwenden
${myarray[-1]}
, um das letzte Element abzurufen. Sie können dasselbe für den vorletzten Schritt tun und so weiter. in Bash:Das gleiche gilt auch für die Zuordnung. Wenn es "Ausdruck" sagt, bedeutet es wirklich einen Ausdruck; Sie können dort einen beliebigen arithmetischen Ausdruck eingeben, um den Index zu berechnen, einschließlich eines Ausdrucks, der
${#myarray[@]}
explizit anhand der Länge des Arrays berechnet wird .quelle
ksh
und tunzsh
.zsh
obwohl standardmäßig Arrays 1-indiziert sind, im Gegensatz zubash
undksh
wo sie sind 0-indiziert.Modern bash (v4.1 oder besser)
Sie können das letzte Element am Index lesen
-1
:Unterstützung für den Zugriff auf numerisch indizierte Arrays von Anfang an unter Verwendung negativer Indizes, die mit der Bash-Version 4.1-alpha gestartet wurden .
Ältere Bash (v4.0 oder früher)
Sie müssen die Array-Länge von erhalten
${#a[@]}
und dann eine subtrahieren, um das letzte Element zu erhalten:Da Bash Array-Indizes als arithmetischen Ausdruck behandelt, ist keine zusätzliche Notation erforderlich, z. B.
$((...))
um die arithmetische Auswertung zu erzwingen.quelle
modern
mit einer Version qualifizieren könnten .bash
Arrayzuordnung, Referenz, Unset mit negativem Index wurden erst in Bash 4.3 hinzugefügt . In älteren Versionen vonbash
können Sie den Ausdruck im Index verwendenarray[${#array[@]-1}]
Eine andere Möglichkeit, auch mit älteren Versionen von
bash
(bash 3.0 oder besser) zu arbeiten:oder:
Mit negativen Offset, müssen Sie trennen
:
mit-
der Verwechslung zu vermeiden:-
Expansion.quelle
"${a[@]: -1}"
und es wird (nebenbash
undzsh
) auch inksh
.zsh
oder nicht überprüftbash
, aber ich habe sie in allen drei Shells getestet.)Array
Die ältesten Alternativen in bash (seit bash 3.0+) sind:
Das Leerzeichen ist erforderlich, um die Interpretation von
:
gefolgt von einem Minus-
als Erweiterung von"${var:-abc}"
(Use Default Values) zu vermeiden .Das
~
ist eine arithmetische bitweise Negation (entspricht dem eigenen Komplement oder spiegeln Sie alle Bits ). Von Mann Bash:Seit bash-4.2 + auch:
Seit bash 5.0+ auch:
Für alle Bash-Versionen (ältere Bash):
@
Für Positionsargumente (seit Bash 2.01):
Eine tragbare Lösung für alle Shells ist die Verwendung von eval:
quelle
~
im Handbuch durchsucht und es nicht gesehen.$@
?bash: ${@[@]:(-1)}: bad substitution
man bash
Verweis (überprüfen Sie die erweiterte Antwort unter @ title). @TomHale@
ist kein Array (also kein vollständiges Array ) in der Bash und akzeptiert den Index ([]
) für einzelne Argumente nicht. Sie müssen verwenden${@:(-1)}
oder gleichwertig. Überprüfen Sie den erweiterten Eintrag im@
Titel. @TomHaleAuch das können Sie tun:
Ergebnis:
Was Sie tun, ist, die gesamte Anzahl der Elemente im Array abzurufen und -1 zu subtrahieren, da Sie alle Elemente abrufen, und nicht ab dem Arrayindex 0 beginnen.
quelle