bash - Skript -> mehrere Leerzeichen in Variable

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
klal
Beiträge: 237
Registriert: 20.12.2007 12:16:41

bash - Skript -> mehrere Leerzeichen in Variable

Beitrag von klal » 06.05.2008 23:04:29

Hallo,
unter Testing habe ich ein Skript das eine Textdatei zeilenweise ausliest und diese Zeile in einer Variable speichert.
Wenn die Zeile mehrere aufeinanderfolgende Leerzeichen hat werden diese in der Variable auf 1 Leerzeichen reduziert.

DATEI1 ist die Variable
DATEN_NEU1 der Pfad zur Textdatei

1. DATEI1=$(head -n 1 $DATEN_NEU1 | tail -n 1 )
2. head -n 1 $DATEN_NEU1 | tail -n 1
3. echo $DATEI1

Wenn die Zeile der Textdatei nun "Ha llo" (2 Leerzeichen) enthält,

dann gibt Zeile 2: Ha llo (2 Leerzeichen)
und Zeile 3: Ha llo (1 Leerzeichen)

aus.

Ist das ein Bug in Testing oder übersehe ich da etwas?
Habe schon alle möglichen Varianten an '"\" ... durch.

Grüße
K.

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Re: bash - Skript -> mehrere Leerzeichen in Variable

Beitrag von mistersixt » 07.05.2008 07:29:22

Ich vermute, das liegt am IFS, in der man page von bash steht:

Code: Alles auswählen

       IFS    The Internal Field Separator that is  used  for  word  splitting
              after  expansion  and  to  split  lines into words with the read
              builtin  command.   The  default  value  is  ‘‘<space><tab><new‐
              line>’’.
Setz also mal vor Deinen Aktionen den IFS auf etwas anderes als ‘<space><tab><new‐line>, beispielsweise auf:

Code: Alles auswählen

IFS=";"
Und probier dann nochmal. Hier ein kleines Beispiel, was es bewirkt:

Code: Alles auswählen

mars:/tmp# BLA="one two three"
mars:/tmp# for i in $BLA; do echo $i; done
one
two
three
mars:/tmp# IFS=;
mars:/tmp# for i in $BLA; do echo $i; done
one two three
mars:/tmp#
Gruss, mistersixt.
--
System: Debian Bookworm, 6.11.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 3.8 Ghz., Radeon RX 5700 XT, 32 GB Ram, XFCE

klal
Beiträge: 237
Registriert: 20.12.2007 12:16:41

Re: bash - Skript -> mehrere Leerzeichen in Variable

Beitrag von klal » 07.05.2008 09:10:05

Ja, das funktioniert. :)
Allerdings liegt das Problem jetzt bei dem neuen IFS.

Bei der Textliste handelt es sich um Dateipfade/namen.
Welches Zeichen darf denn wohl in keinem Dateinamen vorkommen?

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: bash - Skript -> mehrere Leerzeichen in Variable

Beitrag von cosmac » 07.05.2008 11:58:20

hi,
klal hat geschrieben:Welches Zeichen darf denn wohl in keinem Dateinamen vorkommen?
In Dateinamen dürfen alle Zeichen außer '/' vorkommen.
Das nützt dir aber auch nichts, wenn du Pfadnamen verarbeitest.
Ich würde eher in Richtung Anführungszeichen weiterforschen.
In diesem einfachen Beispiel funktioniert's schon mal:

Code: Alles auswählen

DATEI1="abc   123"
echo $DATEI1
abc 123
echo "$DATEI1"
abc   123
Dieses Verhalten ist jedenfalls kein Bug, grundsätzlich hat es sich
seit über 30 Jahren so bewährt. Der eigentliche Fehler ist die Unsitte,
Leerzeichen in Namen zu haben; ein Wort endet nunmal vor dem
nächsten Leerzeichen/TAB/Zeilenende. Ach ja, selbst Zeilenenden
sind in Dateinamen erlaubt 8O
Beware of programmers who carry screwdrivers.

klal
Beiträge: 237
Registriert: 20.12.2007 12:16:41

Re: bash - Skript -> mehrere Leerzeichen in Variable

Beitrag von klal » 07.05.2008 15:17:13

Jetzt habe ich das þ als Trenner genommen und hoffe, das es selten vorkommen wird ...
Danke für den IFS-Tip :D
Grüße
K

Antworten