Siduction Forum

Siduction Forum => Scripting & Kernelhacking => Topic started by: bluelupo on 2013/01/19, 15:18:50

Title: gelöst:Probleme mit Leerzeichen in Shellscript Übergabepar
Post by: bluelupo on 2013/01/19, 15:18:50
Hallo zusammen,
ich habe ein etwas kniffeliges Problem innerhalb eines Shellscriptes das sich wie folgt darstellt.

Das Script wird aufgerufen mit einer Liste von Dateien mit Pfadangabe, zB. so:

Code: [Select]

$ ./merge4pdf.sh /tmp/dok_01.pdf /tmp/dok_02.pdf


Im Script werden diese beiden PDF-Dateien mit Hilfe von pdftk aneinander gehängt. Das funktioniert aber nur wenn die Dateien keine Leerzeichen enthalten, dann nämlich wird an den Leerzeichen getrennt und es kommen natürlich Dateinamen heraus die so nicht existieren.

Beispielaufruf mit Leerzeichen im Dateinamen:
Code: [Select]

$ ./merge4pdf.sh /tmp/dok 01.pdf /tmp/dok 02.pdf


Aus diesen beiden Dateinamen wir dann folgende Liste:
/tmp/dok
01.pdf
/tmp/dok
02.pdf

Das kann natürlich funktionieren das dies unsinnige Dateinamen ergibt die nicht existent sind.

Die übergebenen Dateinamen kommen übrigens aus Dateimanager Dolphin in dem ich ein userspez. Kontextmenü (Servicemenü) für PDF-Dateien eingestellt habe. Diese werden mit %U an das Shellscript merge4pdf.sh übergeben und dort mit $@ weiter verarbeitet.

mergePDF.desktop
Code: [Select]

[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
Actions=merge4pdf;
Encoding=UTF-8
X-KDE-Priority=TopLevel

[Desktop Action merge4pdf]
Name=PDF Dateien zusammenhängen
Icon=application-pdf
Terminal=true
Exec=/usr/bin/uxterm -e "/usr/local/scripts/merge4pdf.sh %U"


Hier mein Script merge4pdf.sh:
Code: [Select]

#!/bin/bash
#
ALL_PDF="$@"
COUNTER=0

echo "Die markierten PDF-Dateien..."
echo ""
for NAME in $@
        do
        echo " $NAME"
        FILE=`basename $NAME`
        FILE_PRAEFIX=`echo $FILE | cut -d"." -f1`
        if [ $COUNTER -eq 0 ]
                then
                DIRNAME=`dirname $NAME`
                MERGE_PDF=$FILE_PRAEFIX
        elif [ $COUNTER -gt 0 ]
                then
                MERGE_PDF=$MERGE_PDF"_"$FILE_PRAEFIX
        fi
        COUNTER=`expr $COUNTER + 1`
done

echo ""
echo "...werden zu einem Dokument zusammengefügt"
echo ""

MERGE_PDF=$MERGE_PDF".pdf"
pdftk $ALL_PDF cat output $DIRNAME/$MERGE_PDF

echo " $DIRNAME/$MERGE_PDF"
echo ""
echo ""
echo "Fenster bitte schließen mit Taste RETURN"
read RET


Wie kann das Script so gestalten das es auch mit Dateinamen die ein Leerzeichen enthalten funktioniert.
Title: Re: Probleme mit Leerzeichen in Shellscript Übergabeparamet
Post by: midrow on 2013/01/19, 19:41:45
Hallo bluelupo,

ich hab gerade nicht viel Zeit und daher Dein merge-Script nicht vollständig gelesen ... aber etwa folgendermaßen solltest Du weiterkommen (s. man bash):

Anstatt
Code: [Select]
for NAME in $@
besser:
Code: [Select]
for NAME in "$@"

Und anstatt
Code: [Select]
FILE=`basename $NAME`
DIRNAME=`dirname $NAME`

besser:
Code: [Select]
FILE=`basename "$NAME"`
DIRNAME=`dirname "$NAME"`


Bis bald
midrow
Title: Re: Probleme mit Leerzeichen in Shellscript Übergabeparamet
Post by: ralul on 2013/01/20, 18:06:48
In der .desktop Datei probieren, enweder oder:
Exec=/usr/bin/uxterm -e /usr/local/scripts/merge4pdf.sh "%U"
Exec=/usr/bin/uxterm -e /usr/local/scripts/merge4pdf.sh '%U'
Exec=/usr/bin/uxterm -e "/usr/local/scripts/merge4pdf.sh '%U'"

Sonst: kann man, im shellscript die parameter natürlich auch wieder zusammenfügen:
if [ -f "$1" ] ; then
...
elif f [ -f "$1 $2" ] ; then
fi
Title: Re: Probleme mit Leerzeichen in Shellscript Übergabeparamet
Post by: bluelupo on 2013/01/20, 20:12:46
Hi,
ich hab's gelöst. Letztendlich lag es an den Blanks als Seperatorzeichen (interne Bashvariable IFS). Die setzte ich im Script jetzt temporär auf den Seperator ";" womit das ganze dann funktioniert.

Hier mein finales Script, das jetzt mit auch mit Dateinamen die ein Leerzeichen enthalten, umgehen kann.

@ralul: deinen Tipp muss ich mal zu Gemüte führen - Danke!

Code: [Select]

#!/bin/bash
#
ALL_PDF="$@"
COUNTER=0
FILE_LIST=`echo ${ALL_PDF// \//;\/}`

echo "Die markierten PDF-Dateien..."
echo ""

IFS=";"
for NAME in $FILE_LIST
do
echo " $NAME"
FILE=`basename $NAME`
FILE_PRAEFIX=`echo $FILE | cut -d"." -f1`

if [ $COUNTER -eq 0 ]
then
DIRNAME=`dirname $NAME`
MERGE_PDF=$FILE_PRAEFIX
elif [ $COUNTER -gt 0 ]
then
MERGE_PDF=$MERGE_PDF"_"$FILE_PRAEFIX
fi
COUNTER=`expr $COUNTER + 1`
done

NO_BLANKS=`echo $MERGE_PDF | tr -d [:blank:]`
MERGE_PDF=$NO_BLANKS".pdf"

# Einen komletten String für die Verarbeitung mit pdftk erstellen
# IFS muss temp. gesetzt werden, ansnsten erzeugen Dateinamen mit
# Blanks Fehlermeldungen beim pdftk Kommando
COUNTER=0
IFS=";"
for STRING in $FILE_LIST
do
if [ $COUNTER -eq 0 ]
then
ONE_NAME_STRING=$STRING
elif [ $COUNTER -gt 0 ]
then
ONE_NAME_STRING="$ONE_NAME_STRING;$STRING"
fi
COUNTER=`expr $COUNTER + 1`
done

pdftk $ONE_NAME_STRING cat output $DIRNAME/$MERGE_PDF

echo ""
echo "...werden zu einem Dokument zusammengefügt"
echo ""

echo " $DIRNAME/$MERGE_PDF"
echo ""
echo ""
echo "Fenster bitte schließen mit Taste RETURN"
read RET
#EOF