cygwin script führende Leerstellen in Variable erhalten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
bebobfan
Beiträge: 3
Registriert: 25.07.2013 14:42:09

cygwin script führende Leerstellen in Variable erhalten

Beitrag von bebobfan » 25.07.2013 15:03:11

In einem bash-script lese ich eine Datei deren Zeilen teilweise mit Leerstellen beginnen in einer while-Schleife. Mit dem Kmdo
if [ "`echo $ZEILE | grep -c '^ '`" -eq 0 ]
versuche ich zu Prüfen ob die Zeile mit einer Leerstelle beginnt. Ich erhalte aber immer das Ergebnis "0" auch bei den Zeilen, die mit Leerstellen beginnen.
was mache ich falsch?
PS: auch das Kmdo
echo "$ZEILE"
zeigt den Zeileninhalt ohne führende Leerzeichen. Führe ich dieses Kmdo in der Shell (bash) aus, in der ich das Script ausführe, werden die Leerzeichen angezeigt.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: cygwin script führende Leerstellen in Variable erhalten

Beitrag von Cae » 25.07.2013 15:19:32

Das Quoting ist verkehrt, $ZEILE mag zwar <space><space>test sein, aber weil's nicht gequotet ist, sieht die Shell echo<space><space><space>test, was zu echo<space>test reduziert wird. Das grep sieht nie mehrfache Leerzeichen am Anfang oder Ende (und auch nicht zwischendrin, zwischen den Argumenten von echo).

Unschoene Loesung:

Code: Alles auswählen

if [ "`echo "$ZEILE" | grep -c '^ '`" -eq 0 ]
Schoen ist das aber trotzdem nicht, grep kennt -q:

Code: Alles auswählen

if echo "$ZEILE" | grep -q '^[^ ]'; then
-- allerdings ist dann die Logik invertiert, daher muss man die RegEx umschreiben. Den extra-fork() fuer grep kann man sich auch ueber Shell-Builtins sparen, z.B.

Code: Alles auswählen

case "$ZEILE" in
	" "*)
		# if-Teil
		;;
	*)
		#else-Teil
		;;
esac
oder vermutlich auch per ${##%%}-Voodoo.

Willkommen im Forum!

Gruss Cae

--Edit: Eben stand das PS: noch nicht da. Vermutlich liest du per read ein, das frisst aber Vorkommen von $IFS am Zeilenanfang. Loesung: $IFS leeren:

Code: Alles auswählen

$ read foo
 as df
$ echo "$foo"
as df
$ IFS='' read foo
 as df
$ echo "$foo"
 as df
Also in deinem Fall vermutlich

Code: Alles auswählen

while IFS='' read ZEILE; do
	...
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

bebobfan
Beiträge: 3
Registriert: 25.07.2013 14:42:09

Re: cygwin script führende Leerstellen in Variable erhalten

Beitrag von bebobfan » 25.07.2013 16:43:41

Hallo Cae danke für Deine Antwort.
Ich habe Deine Vorschläge probiert aber es hat sich nichts verändert. Es scheint ein grundsätzliches Problem zu sein. Im Script sehe ich nie ein Leerzeichen am Zeilenbeginn egal ob ich echo $ZEILE verwende oder echo "$ZEILE". In der Shell (außerhalb des scripts) macht das sehr wohl einen Unterschied,
und es werden im 2. Fall die Leerzeichen angezeigt.

bebobfan
Beiträge: 3
Registriert: 25.07.2013 14:42:09

Re: cygwin script führende Leerstellen in Variable erhalten

Beitrag von bebobfan » 25.07.2013 17:15:31

Das Problem ist geköst!
Ich habe IFS='' an den Anfang des Scripts gesetzt und nun funktioniert die Abfrage auf führende Leerstellen.
Nochmals Danke für die Hilfe

Antworten