Warum liest unix beim Lesen nicht die letzte Zeile?

7

Mein Skript

%Vor%

Meine Datei hello

%Vor%

Meine Ausgabe

%Vor%

Wenn ich nach 3:3:3:3 in hello eine Leerzeile anlege, wird die Ausgabe

%Vor%

Wer weiß, wie ich dieses Problem beheben kann, so dass ich keine leere Zeile am Ende von hello setzen muss?

    
Popcorn 15.11.2013, 21:16
quelle

5 Antworten

11

Der Befehl read schlägt fehl, wenn die Eingabe nicht mit einem Zeilenumbruch abgeschlossen wird. Da das Zeilenumbruchzeichen am Ende der Datei fehlt, schlägt% code_% fehl, sodass die letzte Iteration der Schleife read übersprungen wird.

Wenn Sie nicht sicherstellen möchten, dass Ihre Eingabedatei am Ende einen Zeilenumbruch hat, können Sie Ihre while mit einer cat gruppieren, um beispielsweise den Eindruck zu erwecken, dass eine Eingabe durch einen Zeilenumbruch beendet wurde so:

%Vor%

oder wie folgt:

%Vor%     
janos 15.11.2013, 21:19
quelle
4

Es gibt einen nicht sehr bekannten, hässlichen Hack, um eine fehlende letzte Zeilenumbruch an einen Text-Stream anzuhängen, wenn und nur wenn es fehlt:

%Vor%

Siehe diese Diskussion auf unix.stackexchange, zum Beispiel.

    
user2719058 15.11.2013 21:33
quelle
3

Dies ist eine ausführliche Lektüre für die Frage warum?

Wenn Sie keine neue Zeile am Ende einfügen möchten, können Sie dies tun:

%Vor%

Oder mit grep :

%Vor%

Hinweis:

  1. Es ist nicht notwendig, cat mit while-Schleife zu verwenden.
  2. Sie sollten die Option -r fast immer mit read verwenden.
Jahid 14.07.2015 05:18
quelle
1

Dies liegt wahrscheinlich daran, dass in der Eingabedatei kein Zeilenvorschubzeichen nach der letzten Zeile vorhanden ist.

Führen Sie diesen Befehl aus, um Folgendes herauszufinden:

%Vor%

Und sehen Sie, was Sie bekommen.

    
anubhava 15.11.2013 21:23
quelle
1

Ihre Datei enthält wahrscheinlich eine neue Zeile ( \n ) in der letzten Zeile. Sie können dies beweisen, indem Sie die Residualwerte von $a usw. wie folgt drucken

%Vor%

Fix die Datei. Außerdem sollten Sie IFS speziell für read wie oben gezeigt festlegen können. Und es ist auch nicht nötig, cat der Datei zu verwenden, verwenden Sie einfach die Eingabeumleitung wie gezeigt

    
iruvar 15.11.2013 21:25
quelle

Tags und Links