Vertracktes Bash-Problem mit Argumenten

19/10/2010 - 21:48 von Roman Fietze | Report spam
Hallo,

Zum Hintergrund des Problems siehe unten.

Kurz: ImageMagick draw rectangle Kommando dynamisch in ein convert
einbauen.

Ich habe zum Ueben mein Script mal drastisch reduziert auf folgendes
fehlerhafte Script:

snippety snip
#!/bin/bash
set -x

function rect
{
echo "-stroke black -strokewidth 3 -draw 'rectangle 1,2 5,6'"
}

convert -size 10x10 xc:transparent -fill transparent \
$(
rect
) \
out.png
snappety snap

Aber das geht ja schief, Der Parameter zu -draw wird in seine
Einzelteile zerlegt. Also habe ich mir mit folgender Kruecke beholfen:

snippety snip
#!/bin/bash
set -x

function rect
{
echo -e "-strokeblack-strokewidth3-drawrectangle 1,2 5,6"
}

IFS='
'

convert -size 10x10 xc:transparent -fill transparent \
$(
rect
) \
out.png
snappety snap

Aber das ist ziemlich mistig. Ab dem Setzen von IFS habe ich nur noch
Probleme am Hals, wenn ich noch weitere Dinge anstellen will. Aber ich
komme einfach nicht drauf wie ich das mit der bash eleganter loesen
koennte. Ich habe beinahe alle Kombinationen von Escapes und
Hochkommas ausprobiert, bisher ohne Erfolg.

Die Function rect berechnet im richtigen Script natuerlich die x und y
aus den verschiedenen EXIF-Daten der Kamera.


Hintergrund lang: ein Script um mit ImageMagick die AF-Sensoren wie
sie im EXIF stehen ueber ein Bild zu legen. In digikam ist das erst
ein Enhancement Request.

Hierzu wird der IM Befehl

-draw "rectangle $x0,$y0 $x1,$y1"

benutzt. Wichtig hierbei, das Argument zu -draw ist eines, nicht
mehrere einzelne. Nun aber hat so eine DSLR ja viele AF-Sensoren,
manche davon genutzt. D.h. ich habe eine Funktion mit dem Namen
"rect", deren Ausgabe in das IM convert-Kommando eingebaut werden soll
um mehrere Rechtecke zu zeichnen (wie z.B. im Canon DPP oder dem TFT
der Kamera selbst).


function rect
{
# after some mathematics
echo "-stroke $5 -strokewidth $6 -draw 'rectangle $x0,$y0 $x1,$y1'"
}

... exiftool Output parsen und in Variablen mit dem Namen der Tags
ablegen ...

convert ... \
-fill transparent \
$(
...

for i in "${AFPointsInFocus[@]}"
do
rect ${AFAreaXPositions[$i] <noch Y, H und W> $afinfocuscolor 3
done

... # noch AFPointsSelected
) \
...


Roman

Roman Fietze Telemotive AG Buero Muehlhausen
Breitwiesen 73347 Muehlhausen
Tel.: +49(0)7335/18493-45 http://www.telemotive.de
Um die Liste abzubestellen, schicken Sie eine Mail an:
opensuse-de+unsubscribe@opensuse.org
Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken
Sie eine Mail an: opensuse-de+help@opensuse.org
 

Lesen sie die antworten

#1 Sebastian Siebert
20/10/2010 - 06:41 | Warnen spam
Hallo Roman,

Am 19.10.2010 21:48, schrieb Roman Fietze:
Zum Hintergrund des Problems siehe unten.

Kurz: ImageMagick draw rectangle Kommando dynamisch in ein convert
einbauen.

Ich habe zum Ueben mein Script mal drastisch reduziert auf folgendes
fehlerhafte Script:

snippety snip
#!/bin/bash
set -x

function rect
{
echo "-stroke black -strokewidth 3 -draw 'rectangle 1,2 5,6'"
}

convert -size 10x10 xc:transparent -fill transparent \
$(
rect
) \
out.png
snappety snap

[...]



Falls du dich zu sehr darauf versteifst und in deinem Skript nur noch
Verschlimmbesserungen einbaust, dann solltest du besser nochmal zum
Anfang zurück und eine etwas làngere Pause einlegen. Oft ist die Lösung
direkt vor der Nase. ;-)

Ich würde im o.g. Code-Ausschnitt den Parameter für convert von der
Funktion "rect" nicht mit echo ausgeben lassen, sondern in einer
Variable wegspeichern.

Hier ein Beispiel:

ANFANG ANFANG ANFANG ANFANG ANFANG
#!/bin/bash

# initialisieren
RECT_PARAMETER=""

function rect() {

# die übergebenen Parameter ($1,$2,$3,...) an diese Funktion
# an dieser Stelle verarbeiten lassen
# ...

# Werte festlegen (ggfs. vorher von irgendwo auslesen)
STROKE="black"
STROKEWIDTH="3"
X0="1"
Y0="2"
X1="5"
Y1="6"

# Parameter für convert zusammen bauen
RECT_PARAMETER="-stroke ${STROKE} \
-strokewidth ${STROKEWIDTH} \
-draw 'rectangle ${X0},${Y0} ${X1},${Y1}'"
}

# hier weiteren code

# Aufruf der Funktion "rect" ggfs. mit weiteren Parameter
rect wert1 wert2 wert3 wert4 usw.

# Die Variable RECT_PARAMETER im convert-Parameter einbetten
convert -size 10x10 xc:transparent \
-fill transparent \
${RECT_PARAMETER} \
out.png

# hier weiteren code
ENDE ENDE ENDE ENDE ENDE

Das o.g. Beispiel kann man noch weiter ausführen. Jedoch würde das den
Rahmen sprengen.

Folgende Dokumentation kann dir beim Skripting helfen:
# info bash

HTH,

Gruß Sebastian - openSUSE Member (Freespacer)
Webseite/Blog: <http://www.sebastian-siebert.de>
Wichtiger Hinweis zur openSUSE Mailing Liste:
<http://de.opensuse.org/OpenSUSE_Mai...quette>
Um die Liste abzubestellen, schicken Sie eine Mail an:
opensuse-de+
Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken
Sie eine Mail an: opensuse-de+

Ähnliche fragen