Angenommen, ich habe eine Unix-Shell-Variable wie unten
variable=abc,def,ghij
Ich möchte , um alle Werte extrahieren ( abc
, def
und ghij
) einen for - Schleife und jeden Wert in eine Prozedur übergeben.
Das Skript sollte das Extrahieren einer beliebigen Anzahl von durch Kommas getrennten Werten ermöglichen $variable
.
Antworten:
Mit dem folgenden Skript können Sie Ihre Variable dynamisch durchlaufen, unabhängig davon, wie viele Felder sie enthält, solange sie nur durch Kommas getrennt ist.
Anstelle des
echo "$i"
obigen Aufrufs zwischendo
unddone
innerhalb der for-Schleife können Sie Ihre Prozedur aufrufenproc "$i"
.Update : Das obige Snippet funktioniert, wenn der Wert der Variablen keine Leerzeichen enthält. Wenn Sie eine solche Anforderung haben, verwenden Sie bitte eine der Lösungen, die sich ändern können,
IFS
und analysieren Sie dann Ihre Variable.Hoffe das hilft.
quelle
$variable
Leerzeichen enthalten sind, z. B.variable=a b,c,d
=> druckt 4 Zeilen (a | b | c | d) anstatt 3 (ab | c | d)"value
** hinzugefügt .Nicht mit IFS herumspielen
Kein externer Befehl aufrufen
Verwenden der Bash-String-Manipulation http://www.tldp.org/LDP/abs/html/string-manipulation.html
quelle
IFS
!$i
Leerzeichen enthält, werden diese aufgeteilt (und dies könnte der Grund dafür sein, dass er eher durch Kommas als durch Leerzeichen getrennt übergeben wird)for i in ${variable//,/$IFS} do; echo "$i"; done
Wenn Sie ein anderes Feldtrennzeichen festlegen, können Sie direkt eine
for
Schleife verwenden:Sie können die Werte auch in einem Array speichern und dann wie in Wie teile ich eine Zeichenfolge in einem Trennzeichen in Bash? ::
Prüfung
In dieser Lösung finden Sie einen breiteren Ansatz zum Durchlaufen einer durch Kommas getrennten Liste und Ausführen eines Befehls für jeden Eintrag .
Beispiele für den zweiten Ansatz:
quelle
while
zum Einlesen in ein Array und ein anderes zum Durchlaufen der Ergebnisse.IFS
zurücksetzen, was es vorher war?Ich bevorzuge die Verwendung von tr anstelle von sed, da sed in einigen Fällen Probleme mit speziellen Zeichen wie \ r \ n hat.
Eine andere Lösung besteht darin, IFS auf ein bestimmtes Trennzeichen zu setzen
quelle
Hier ist eine alternative tr-basierte Lösung, die kein Echo verwendet, ausgedrückt als Einzeiler.
Es fühlt sich ohne Echo aufgeräumter an, aber das ist nur meine persönliche Präferenz.
quelle
Probier diese.
quelle
http://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file
. Danach Machen Sie das für Schleife in while-Schleife. Sie können das bekommen.Eine andere Lösung, bei der IFS nicht verwendet wird und die Leerzeichen dennoch erhalten bleiben:
quelle
Hier ist meine reine Bash-Lösung, die IFS nicht ändert und einen benutzerdefinierten Regex-Begrenzer verwenden kann.
quelle