Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: [DE] gelöst:Probleme mit Leerzeichen in Shellscript Übergabepar  (Read 13043 times)

Offline bluelupo

  • User
  • Posts: 2.068
    • BluelupoMe
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.

Offline midrow

  • User
  • Posts: 69
Re: Probleme mit Leerzeichen in Shellscript Übergabeparamet
« Reply #1 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

Offline ralul

  • User
  • Posts: 1.814
Re: Probleme mit Leerzeichen in Shellscript Übergabeparamet
« Reply #2 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
experiencing siduction runs better than my gentoo makes me know I know nothing

Offline bluelupo

  • User
  • Posts: 2.068
    • BluelupoMe
Re: Probleme mit Leerzeichen in Shellscript Übergabeparamet
« Reply #3 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