Gibt es eine einfache Möglichkeit, ein Array umzukehren?
#!/bin/bash
array=(1 2 3 4 5 6 7)
echo "${array[@]}"
so würde ich bekommen: 7 6 5 4 3 2 1
anstelle von:1 2 3 4 5 6 7
Gibt es eine einfache Möglichkeit, ein Array umzukehren?
#!/bin/bash
array=(1 2 3 4 5 6 7)
echo "${array[@]}"
so würde ich bekommen: 7 6 5 4 3 2 1
anstelle von:1 2 3 4 5 6 7
Ich habe die Frage wie geschrieben beantwortet und dieser Code kehrt das Array um. (Das Drucken der Elemente in umgekehrter Reihenfolge, ohne das Array umzukehren, ist nur eine for
Schleife, die vom letzten Element bis auf Null herunterzählt.) Dies ist ein Standardalgorithmus zum "Ersten und Letzten Tauschen".
array=(1 2 3 4 5 6 7)
min=0
max=$(( ${#array[@]} -1 ))
while [[ min -lt max ]]
do
# Swap current first and last elements
x="${array[$min]}"
array[$min]="${array[$max]}"
array[$max]="$x"
# Move closer
(( min++, max-- ))
done
echo "${array[@]}"
Es funktioniert für Arrays mit ungerader und gerader Länge.
Ein weiterer unkonventioneller Ansatz:
Ausgabe:
Wenn
extdebug
aktiviert,BASH_ARGV
enthält das Array in einer Funktion alle Positionsparameter in umgekehrter Reihenfolge.quelle
Unkonventioneller Ansatz (alles nicht rein
bash
):Wenn alle Elemente in einem Array nur aus einem Zeichen bestehen (wie in der Frage), können Sie Folgendes verwenden
rev
:Andernfalls:
und wenn du kannst
zsh
:quelle
tac
, als das Gegenteil voncat
ganz gut zu merken, DANKE!rev
, muss ich erwähnen, dassrev
für Zahlen mit zwei Ziffern nicht richtig funktioniert. Beispielsweise wird ein Array-Element der12
Verwendung von rev als gedruckt21
. Probieren Sie es aus ;-)Wenn Sie tatsächlich das Gegenteil in einem anderen Array wollen:
Dann:
Gibt:
Dies sollte Fälle korrekt behandeln, in denen beispielsweise ein Array-Index fehlt.
array=([1]=1 [2]=2 [4]=4)
In diesem Fall können durch Schleifen von 0 zum höchsten Index zusätzliche leere Elemente hinzugefügt werden.quelle
shellcheck
zwei Warnungenarray=(1 2 3 4)
<-- SC2034: array appears unused. Verify it or export it.
echo "${foo[@]}"
<-- SC2154: foo is referenced but not assigned.
declare
Zeile ist.declare -n
in Bash-Versionen vor 4.3 nicht funktioniert.So tauschen Sie die Array-Positionen aus (auch bei spärlichen Arrays) (seit Bash 3.0):
Bei der Ausführung:
Für ältere Bashs müssen Sie eine Schleife (in Bash (seit 2.04)) verwenden und
$a
das folgende Leerzeichen verwenden , um das nachfolgende Leerzeichen zu vermeiden:Für Bash seit 2.03:
Auch (mit dem bitweisen Negationsoperator) (seit Bash 4.2+):
quelle
Hässlich, nicht zu pflegen, aber Einzeiler:
quelle
eval eval echo "'\"\${array[-'{1..${#array[@]}}']}\"'"
.ind=("${!array[@]}");eval eval echo "'\"\${array[ind[-'{1..${#array[@]}}']]}\"'"
Obwohl ich nichts Neues erzählen werde und auch
tac
das Array umkehren werde, wäre es dennoch erwähnenswert, die folgende einzeilige Lösung mit der bash-Version 4.4 zu erwähnen:Testen:
Beachten Sie, dass der in read enthaltene Variablenname der Name des ursprünglichen Arrays ist, sodass für die temporäre Speicherung kein Hilfsarray erforderlich ist.
Alternative Implementierung durch Anpassung des IFS:
PS: Ich denke, obige Lösungen funktionieren nicht in der folgenden
bash
Version,4.4
da verschiedeneread
Bash-Funktionen implementiert wurden.quelle
IFS
Version funktioniert , aber es ist auch Druck:declare -a array=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6" [6]="10" [7]="11" [8]="12")
. Bash benutzen4.4-5
. Sie haben zu entfernen ,;declare -p array
am Ende der ersten Zeile, dann funktioniert es ...declare -p
ist nur ein schneller Weg, um bash das echte Array (Index und Inhalt) drucken zu lassen. Sie brauchen diesendeclare -p
Befehl nicht in Ihrem echten Skript. Wenn in Ihren Array-Zuweisungen etwas schief geht, kann dies dazu führen, dass${array[0]}="1 2 3 4 5 6 10 11 12"
= alle Werte im selben Index gespeichert sind - mit Echo werden Sie keinen Unterschied feststellen. Für einen schnellen Array-Ausdruck erhaltendeclare -p array
Sie mit die tatsächlichen Array-Indices und den entsprechenden Wert in jedem Index.read -d'\n'
Methode bei dir nicht funktioniert?read -d'\n'
funktioniert gut.So kehren Sie ein beliebiges Array um (das beliebig viele Elemente mit beliebigen Werten enthalten kann):
Mit
zsh
:Mit
bash
4.4+, dabash
Variablen nicht enthalten NUL - Bytes wie auch immer, Sie GNU verwenden können ,tac -s ''
auf die Elemente gedruckt als NUL Datensätze begrenzt:POSIXly, um das POSIX-Shell-Array (
$@
, aus$1
,$2
...) umzukehren :quelle
Reine bash Lösung, würde als Einzeiler funktionieren.
quelle
rev+=( "${array[i]}" )
scheint einfacher zu sein.Sie können auch in Betracht ziehen,
seq
In freebsd können Sie den Inkrement-Parameter -1 weglassen:
quelle
Bash
Oder
Ergebnis
7 6 5 4 3 2 1
Ausführung
quelle
tac
wurde bereits erwähnt: unix.stackexchange.com/a/412874/260978 , unix.stackexchange.com/a/467924/260978 , unix.stackexchange.com/a/413176/260978