Ich habe diese Zeichenfolge in einer Variablen gespeichert:
IN="bla@some.com;john@home.com"
Nun möchte ich die Zeichenketten aufteilen nach ;
Begrenzungszeichen, so dass ich habe:
ADDR1="bla@some.com"
ADDR2="john@home.com"
Ich brauche nicht unbedingt die ADDR1
y ADDR2
Variablen. Wenn sie Elemente eines Arrays sind, ist das sogar noch besser.
Nach den Vorschlägen aus den nachstehenden Antworten kam ich zu folgendem Ergebnis, das dem entspricht, was ich wollte:
#!/usr/bin/env bash
IN="bla@some.com;john@home.com"
mails=$(echo $IN | tr ";" "\n")
for addr in $mails
do
echo "> [$addr]"
done
Ausgabe:
> [bla@some.com]
> [john@home.com]
Es gab eine Lösung, die die Einstellung Interner_Feld_Trenner (IFS) an ;
. Ich bin mir nicht sicher, was mit dieser Antwort passiert ist, wie setzt man IFS
zurück zum Standard?
RE: IFS
Lösung, ich habe das ausprobiert und es funktioniert, ich behalte die alte IFS
und dann wiederherstellen:
IN="bla@some.com;john@home.com"
OIFS=$IFS
IFS=';'
mails2=$IN
for x in $mails2
do
echo "> [$x]"
done
IFS=$OIFS
Übrigens, als ich versuchte
mails2=($IN)
Ich habe nur die erste Zeichenkette erhalten, wenn ich sie in einer Schleife ohne Klammern ausgedruckt habe $IN
es funktioniert.
30 Stimmen
In Bezug auf Ihr "Edit2": Sie können einfach "IFS aufheben" und der Standardzustand wird wiederhergestellt. Es besteht keine Notwendigkeit, ihn explizit zu speichern und wiederherzustellen, es sei denn, Sie haben Grund zu der Annahme, dass er bereits auf einen anderen Wert als den Standardwert gesetzt wurde. Wenn Sie dies innerhalb einer Funktion tun (und wenn Sie es nicht tun, warum nicht?), können Sie IFS als lokale Variable setzen, die nach dem Verlassen der Funktion auf ihren vorherigen Wert zurückgesetzt wird.
33 Stimmen
@BrooksMoses: (a) +1 für die Verwendung
local IFS=...
wenn möglich; (b) -1 fürunset IFS
wird IFS nicht genau auf seinen Standardwert zurückgesetzt, obwohl ich glaube, dass sich ein nicht gesetzter IFS genauso verhält wie der Standardwert von IFS ($' \t\n '), aber es scheint eine schlechte Praxis zu sein, blind davon auszugehen, dass Ihr Code niemals mit einem benutzerdefinierten IFS-Wert aufgerufen werden wird; (c) eine andere Idee ist, eine Subshell aufzurufen:(IFS=$custom; ...)
Wenn die Subshell beendet wird, kehrt IFS zu dem ursprünglichen Zustand zurück.0 Stimmen
Ich möchte nur einen kurzen Blick auf die Pfade werfen, um zu entscheiden, wohin ich eine ausführbare Datei werfen soll, also habe ich auf die Ausführung von
ruby -e "puts ENV.fetch('PATH').split(':')"
. Wenn Sie reine Bash bleiben wollen, hilft es nicht, wenn Sie eine beliebige Skriptsprache die eine eingebaute Aufteilung hat, ist einfacher.0 Stimmen
Dies ist eine Art Kommentar im Vorbeifahren, aber da der OP E-Mail-Adressen als Beispiel verwendet hat, hat sich jemand die Mühe gemacht, die Frage so zu beantworten, dass sie vollständig RFC 5322-konform ist, d. h., dass jede Zeichenkette in Anführungszeichen vor dem @ erscheinen kann, was bedeutet, dass Sie reguläre Ausdrücke oder eine andere Art von Parser benötigen, anstatt die naive Verwendung von IFS oder anderen simplen Splitterfunktionen.
13 Stimmen
for x in $(IFS=';';echo $IN); do echo "> [$x]"; done
3 Stimmen
Um es als Array zu speichern, musste ich einen weiteren Satz von Klammern setzen und die
\n
für nur ein Leerzeichen. Die letzte Zeile lautet alsomails=($(echo $IN | tr ";" " "))
. Jetzt kann ich also die Elemente vonmails
durch Verwendung der Array-Notationmails[index]
oder einfach in einer Schleife iterieren0 Stimmen
Was auch immer es wert ist, die
tr
Lösung funktioniert in zsh nicht auf die gleiche Weise.0 Stimmen
Für
$IFS
siehe Was ist die genaue Bedeutung vonIFS=$'\n'
0 Stimmen
Sie brauchen weder IFS zu speichern/wiederherzustellen, noch müssen Sie "local" verwenden. ``` declare -a OUT; IFS=';' OUT=( $( echo "$IN") ) ``` ist alles, was Sie brauchen (wie von @user2037659 angedeutet). Der Schlüssel ist, dass Sie Umgebungsvariablen lokal für einen einzelnen Befehl setzen können, indem Sie die Zuweisung(en) vor den Befehl setzen. (Ersetzen Sie das erste ';' durch einen Zeilenumbruch, um die Lesbarkeit zu verbessern). IFS= ist ein besonders nützlicher Fall.