Simples Sh-Script Problem

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Kermit24
Beiträge: 311
Registriert: 29.04.2006 14:44:39

Simples Sh-Script Problem

Beitrag von Kermit24 » 08.02.2014 17:27:49

Hallo,
folgendes Problem treibt mich gerade in den Wahnsinn. Ich möchte per Shellscript eine String-Variable in einer Schleife ergänzen, so dass ich am Ende eine Dateileiste in der Variable habe.
Nur nach der Schleife hat die Variable wieder den Wert wie vor der Schleife:

Code: Alles auswählen

#!/bin/sh
SOURCES=""

echo "Sources sind: $SOURCES"

# PDFs nach PNGs konvertieren!
find /tmp/jbig_opt -iname '*.pdf' | sort | while read file;
do
echo Konvertiere $file nach $file.png ...
SOURCES="$SOURCES $file.png"
echo "Sources sind: $SOURCES"
#convert -density 300x300 "$file" "$file.png"
done

echo "Sources sind: $SOURCES"
Das hat irgendwas mit den Pipes zu tun, weil dadurch wohl eine Subshell aufgerufen wird. Ich habe habe nur keine Ahnung, wie ich das Script abändern kann, so dass das Problem nicht mehr auftritt :(
Bin kurz davor das ganze Shellscript in perl neu zu schreiben, wenn ich keine Lösung finde.

Bin für jeden Tipp dankbar,
Kermit

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: Simples Sh-Script Problem

Beitrag von syssi » 08.02.2014 20:35:46

Ist jetzt auch keine schoene Loesung aber sie funktioniert zumindest:

Code: Alles auswählen

X="vorher"; 
for L in $(find /tmp/jbig_opt -iname '*.pdf' | sort)
do
  X="$X $L"
done
echo $X

Kermit24
Beiträge: 311
Registriert: 29.04.2006 14:44:39

Re: Simples Sh-Script Problem

Beitrag von Kermit24 » 08.02.2014 22:17:57

Besten Dank!
An eine for-Schleife hatte ich nicht gedacht. So funktioniert es wunderbar!

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

Re: Simples Sh-Script Problem

Beitrag von Cae » 08.02.2014 22:30:14

Kermit24 hat geschrieben:Das hat irgendwas mit den Pipes zu tun, weil dadurch wohl eine Subshell aufgerufen wird.
Genau das ist die Ursache, man kann sogar die Schleife wegrationalisieren und das Problem bleibt:

Code: Alles auswählen

#!/bin/sh

date | read foo
echo "\$foo{$foo}"

bar="$(date)"
echo "\$bar{$bar}"
fuehrt zu

Code: Alles auswählen

$foo{}
$bar{Sat Feb  8 22:25:26 CET 2014}
Die einzige mir bekannte Moeglichkeit ist da, das read durch eine Subshell zu ersetzen, wie beim $bar-Beispiel gezeigt. Fuer eine Schleife wechselt man dann entsprechend von while zu for.

Ein Problem ist natuerlich, dass die for-Schleife ihre Argumente auf einmal erhalten muss, was u.U. eine Riesenmenge Speicher frisst. Pipes werden meist nur 4kb gross, da gibt es keinen nennenswerten Speicherbedarf.

Gruss Cae
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

Antworten