Grüße,
Ich schreibe ein einfaches Bash-Skript, das den Inhalt einer Datei in ein Array analysieren muss. Einträge in der Datei sind durch „Newline“ getrennt – die Datei würde also ungefähr so aussehen:
path/to/file
path/to/other/file
Ich möchte den Inhalt analysieren und iterieren. Mein Code sieht derzeit so aus:
CONTENT=`cat /path/to/text/file.txt`
for PATH in $CONTENT
do
echo $PATH
chmod -R 440 $PATH
fi
Dieser Code funktioniert hervorragend mit einer Datei mit UNIX-Zeilenenden. Bei einer Windows-formatierten Textdatei gerät er jedoch kläglich ins Stocken. Die Anweisung „echo $PATH“ erzeugt den korrekten Pfad, aber der chmod schlägt fehl und gibt an, dass die Datei nicht existiert. Mein Problem ist, dass die Windows-Zeilenenden nicht abgeschnitten werden, also versucht er, einen Dateipfad mit chmod zu bearbeiten, der ein Zeilenumbruchzeichen enthält.
Ich muss dafür sorgen, dass das Ganze funktioniert, unabhängig davon, ob die Zieldatei mit Unix- oder Windows-Zeilenumbrüchen erstellt wurde – aber da ich noch relativ neu im Shell-Scripting bin, bin ich mir nicht ganz sicher, wie das geht.
Ich schätze Ihre Hilfe!
Antwort1
Klingt, als müssten Sie bei der Verarbeitung jeder Zeile nur den Wagenrücklauf entfernen. Der wirklich einfache Weg ist die Verwendung des dos2unix
Dienstprogramms, aber wenn Ihr System das nicht hat oder Sie es nicht bekommen können, können Sie ähnliche Dinge mit erreichen tr
, z. B.:
echo $PATH | tr -d '\r'
Weitere Ideen, wie zum Beispiel die Verwendung von sed
, finden Sie auf derWikipediaEintrag.
BEARBEITEN: Ich möchte darauf hinweisen, dass dies $PATH
kein guter Variablenname ist, da er zweifellos von der Umgebung festgelegt wird und andere Programme von seinem Wert abhängen können. Sie sollten erwägen, ihn in etwas wie zu ändern $CUR_PATH
.
Antwort2
Ich würde einfach die erste Zeile des Skripts ändern:
CONTENT=$(tr -d \\r < /path/to/text/file.txt)