Ich versuche, eine for
Schleife für Akte laufen zu lassen und ich möchte vollständige Zeile anzeigen. Stattdessen wird nur das letzte Wort angezeigt. Ich möchte die komplette Linie.
for j in `cat ./file_wget_med`
do
echo $j
done
Ergebnis nach dem Lauf:
Found.
Hier sind meine Daten:
$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
command-line
bash
scripts
user192118
quelle
quelle
Antworten:
for
Die Schleife wird geteilt, wenn Leerzeichen, Tabulatoren oder Zeilenumbrüche angezeigt werden. Daher sollten Sie IFS (Internal Field Separator) verwenden :quelle
unset IFS
danach, damit andere befehle nicht in der gleichen shell beeinflusst werden.$
inIFS=$'\n'
?$
Lässt Zeilenumbrüche in der Zeichenfolge funktionieren. Dies sollte auchlocal IFS=$'\n'
innerhalb einer Funktion erfolgen.$'...'
bekannt ist " ANSI-C Quoting "for
Loops werden standardmäßig in Leerzeichen (Leerzeichen, Tabulator, Zeilenvorschub) aufgeteilt. Die einfachste Möglichkeit, eine Zeile gleichzeitig zu bearbeiten, besteht darin,while read
stattdessen eine Schleife zu verwenden, die in Zeilenumbrüche aufgeteilt wird:Ich würde erwarten, dass Ihr Befehl ein Wort pro Zeile ausspuckt (das ist passiert, als ich es mit einer eigenen Datei ausprobiert habe). Wenn etwas anderes passiert, bin ich mir nicht sicher, was es verursachen könnte.
quelle
for i in `ls`; do echo $1; done
, durch die Ausgabe an den während Befehl kochend:ls|while read i; do echo $i; done
. Dies funktioniert bei Datei- / Ordnernamen mit Leerzeichen, ohne dass Umgebungsvariablen geändert werden müssen. Sehr gute Antwort.ls
gilt es als nicht sicher für die Verwendung mit|
(dem Pipe-Operator).find
ist flexibler und sicherer für diesen Zweck.pbpaste | while read t; do echo "<string>$t</string>"; done
ls -1
kann verwendet werden|
, um eine unformatierte Ausgabe pro Zeile zu gewährleistenGeprüftes Arbeiten, nicht der eine Liner, den Sie wahrscheinlich wollen, aber es ist nicht möglich, dies elegant zu tun.
quelle
Hier ist eine kleine Erweiterung von Mitchell Curries Antwort, die mir aufgrund des geringen Umfangs der Nebenwirkungen gefällt, bei denen es nicht erforderlich ist, eine Variable festzulegen:
quelle
-name '*'
und es wäre das gleiche, nein?Ich würde es so schreiben:
da es am wenigsten Änderungen im Originalskript erfordert (außer für die verwendete Lösung
IFS
, aber es modifiziert dasbash
Verhalten nicht nur für diese Schleifensteuerungsanweisung).quelle
cat
sind hier unnötig.while
Schleife akzeptiert Umleitung ganz gut, weshalb dies normalerweise geschrieben wird alswhile IFS= read -r line; do...done < input.txt
Mapfile ist eine bequeme Methode, um Zeilen aus einer Datei in ein indiziertes Array zu lesen. Es ist nicht so portabel wie read, aber etwas schneller. Durch die Verwendung der for-Schleife vermeiden Sie das Erstellen einer Subshell.
Beachten Sie bei der Verwendung von Pipelines, dass die while-Schleife in eine Subshell umgewandelt wird. Änderungen innerhalb der while-Schleife wie Variablen werden nicht an den äußeren Teil des Skripts weitergegeben.
Beispiel:
(Bessere Lösung):
quelle
Dandalf kam einer funktionellen Lösung sehr nahe, aber man sollte NIEMALS versuchen, das Ergebnis unbekannter Eingabemengen (dh
find ~/.gdfuse -name '*'
) Variablen zuzuweisen ! Oder zumindest versuchen, so etwas über eine Array-Variable zu tun; wenn Sie darauf bestehen, so faul zu sein! Also, hier ist Dandalfs Lösung, die ohne das gefährliche Manöver auskommt. und das alles in einer zeilequelle