Also, wenn ich eine Variable habe
VAR='10 20 30 40 50 60 70 80 90 100'
und es wiedergeben
echo "$VAR"
10 20 30 40 50 60 70 80 90 100
Weiter unten im Skript muss ich jedoch die Reihenfolge dieser Variablen umkehren, damit sie so etwas wie angezeigt wird
echo "$VAR" | <code to reverse it>
100 90 80 70 60 50 40 30 20 10
Ich habe versucht, rev zu verwenden, und es hat buchstäblich alles umgekehrt, so dass es herauskam als
echo "$VAR" | rev
001 09 08 07 06 05 04 03 02 01
Antworten:
Auf GNU-Systemen lautet die Umkehrung von cat tac:
quelle
echo $'100 \n90 80 70 60 50 40 30 20 10'
tac -s" " <<< "$VAR "
Version wird weiterhin eine führende Leerzeile eingefügt, ein abschließendes Leerzeichen hinzugefügt und das abschließende Zeilenumbruchzeichen weggelassen (wieprintf '\n%s ' "$reversed_VAR"
erwartetprintf '%s\n' "$reversed_VAR"
)echo $(tac -s" " <<< $VAR)
hat kein nachgestelltes Leerzeichen, da die$(…)
nachgestellten Zeilen und Leerzeichen entfernt werden, wenn das IFS sie hat. Meine Lösung wird bald korrigiert, danke.Für eine kurze Liste und in einer Variablen ist die Shell selbst die schnellste Lösung:
Ausgabe:
Hinweis: Die Aufteilungsoperation in
set -- $var
ist für die hier verwendete Zeichenfolge ungefährlich. Dies ist jedoch nicht der Fall, wenn die Zeichenfolge Platzhalterzeichen (*
,?
oder[]
) enthält. Es kann mit vermieden werdenset -f
vor dem Aufteilen . Der gleiche Hinweis gilt auch für die folgenden Lösungen (sofern nicht anders angegeben).Oder, wenn Sie eine andere Variable mit der umgekehrten Liste festlegen möchten:
Oder nur die Positionsparameter verwenden.
Oder verwenden Sie nur eine Variable (die var selbst sein kann):
Hinweis: Diese Lösung ist weder von Globing noch von IFS betroffen.
quelle
awk
zur Rettungmit
perl
freundlicher Genehmigung Wie lese ich eine IP-Adresse rückwärts? geteilt von @steeldriverOder mit sich
bash
selbst, indem Sie die Zeichenfolge in ein Array konvertierenquelle
Sie können Bash-Funktionen wie Arrays verwenden, um dies vollständig in Bearbeitung zu tun:
Dies sollte der schnellste Weg sein, vorausgesetzt, dass $ VAR nicht sehr groß ist.
quelle
VAR='+ * ?'
) enthält. Verwenden Sieset -o noglob
oderset -f
, um das zu beheben. Generell ist es eine gute Idee, den Wert$IFS
und den Status des Globbing zu berücksichtigen, wenn Sie den Operator split + glob verwenden. Nein, dass es wenig sinnvoll ist, diesen Operator zu verwendenrev_a+=( ${a[$i]} )
,rev_a+=( "${a[$i]}" )
wäre viel sinnvoller.quelle
Verwenden Sie hier ein bisschen Python-Magie:
Die Funktionsweise ist recht einfach:
"$VAR"
als zweiten Befehlszeilenparametersys.argv[1]
(der erste Parameter mit der-c
Option ist immer genau das - sich-c
selbst. Beachten Sie die Anführungszeichen, um"$VAR"
zu verhindern, dass die Variable selbst in einzelne Wörter aufgeteilt wird (dies geschieht durch Shell, nicht durch Python)..split()
Methode, um sie in eine Liste von Zeichenketten aufzuteilen[::-1]
Teil ist nur erweiterte Slice-Syntax , um die Liste umzukehren" ".join()
und drucken ausAber diejenigen, die keine großen Python-Fans sind, können
AWK
im Wesentlichen dasselbe tun: Aufteilen und Array in umgekehrter Reihenfolge drucken:quelle
python3 -c 'import sys;print(*reversed(sys.argv[1:]))' $VAR
$IFS
die richtigen Zeichen enthält, und ohne den glob-Teil zu deaktivieren."$VAR"
Renditenpython3 -c 'import sys;print(*reversed(sys.argv[1].split()))' "$VAR"
zsh
:$=VAR
spaltet sich$VAR
auf$IFS
.(Oa)
ordnet die resultierende Liste in umgekehrter Reihenfolge an.print -r --
(wie inksh
), genauso wieecho -E -
(zsh
spezifisch) eine zuverlässige Version vonecho
: druckt seine Argumente so, wie sie durch ein Leerzeichen getrennt und durch eine neue Zeile abgeschlossen sind.Wenn Sie nur nach Leerzeichen und nicht nach den darin
$IFS
enthaltenen Elementen (Leerzeichen, Tabulator, Zeilenvorschub, Null) teilen möchten, weisen Sie entweder Leerzeichen zu$IFS
oder verwenden Sie eine explizite Aufteilung wie folgt :So sortieren Sie in umgekehrter numerischer Reihenfolge:
POSIXly (so würde es auch funktionieren
bash
):Mit eingebauter Shell (außer
printf
in einigen Shells) nur Mechanismen (besser für Variablen mit einem kurzen Wert):Mit
awk
(besser für große Variablen, insbesondere mitbash
, aber bis zur Grenze der Größe der Argumente (oder eines einzelnen Arguments)):quelle
Inelegante POSIX- Softwaretools einzeilig :
quelle