Page 1 of 1

Bash Script: Kleines Leerzeichen Problem

Posted: 2007-12-03 22:01
by cotterley
Moin liebe Freunde,

ich habe ein kleines Problem beim Bashscripting. Hier ist aber anzumerken, dass ich leider hier wenig Erfahrung mitbringe. Ich bin als für jede Kritik dankbar. :( Die Suchfunktion und Google habe ich auch schon bemüht, jedoch waren meine Suchparameter wohl nicht gut genug. :oops:

Zu meinem Problem:

Ich habe ein eigenes Script: test.sh
An das übergebe ich mindestens drei Parameter. Die max. Parameteranzahl ist undefiniert und könnte unendlich sein. Nun sind die ersten beiden Parameter für andere zwecke bestimmt und interessieren uns nicht weiter. Parameter 3-x enthalten Dateinamen. Diese werden an einen Array übergeben und werden später in einen String eingelesen. Dieser wird dann an eine ZIP-Aufruf angehängt, um die übergebenen Dateien zu packen.

Der Aufruf:

Code: Select all

test.sh 11 blabla "hund.jpg" "katze.jpg" "maus.jpg"
bringt auch das gewünschte Resultat.

Hier ist nun der Knackpunkt an meinem Script.

Code: Select all

test.sh 11 blabla "hund 2.jpg" "katze 2.jpg" "maus 2.jpg"
Funktioniert leider nicht. Die Leerzeichen in den Dateinamen lassen das Zip Programm annehmen, dass es sich um 6 Dateien handelt. Die Folge ist, dass er nicht eine Datei archiviert.

Auch ein Escapen nützt nichts:

Code: Select all

test.sh 11 blabla "hund 2.jpg" "katze 2.jpg" "maus 2.jpg"
Lässt das Zip Programm glauben, dass es sich um die 6 Dateien hund, 2.jpg, katze, 2.jpg usw. handelt.

Ich bin mir ziemlicher sicher, dass es am fehlerhaften Zusammensetzen des Dateinamen Strings liegt. Aber mir ist da leider kein besserer Weg eingefallen. Auch mehrere Escapes usw. haben mich nicht auf den richtigen Weg geführt. Vielleicht hat jemand von euch einen Tipp, wie ich es besser machen kann. Ich finde leider keine kreative Idee, um das Problem zu lösen.

Vielen Dank für eure Hilfe und noch einen schönen Abend.

Code: Select all

declare -a DATEIEN
zip_str=
i=0

while [ "$1" ]; do
  ((i++)) 
  if (( $i > 2))
    then
      DATEIEN[(($i-2))]="$1"
  fi
  shift
done

anzahl_dateien=$i
let "anzahl_dateien -=2"

for j in $(seq 1 $anzahl_dateien)
do
  zip_str="${zip_str} ${DATEIEN[$j]}" 
done 

zip -r -z < /tmp/kommentar.txt ${zipname} ${zip_str}
P.S. Man möge mir bitte verzeihen, wenn dies hier das falsche Forum ist. :roll:

Re: Bash Script: Kleines Leerzeichen Problem

Posted: 2007-12-03 22:29
by Joe User

Re: Bash Script: Kleines Leerzeichen Problem

Posted: 2007-12-03 22:39
by Roger Wilco
Abgesehen von den von Joe geposteten Links sollte es reichen, wenn du die Zeile

Code: Select all

  zip_str="${zip_str} ${DATEIEN[$j]}"
in folgendes veränderst:

Code: Select all

  zip_str="${zip_str} "${DATEIEN[$j]}""

Re: Bash Script: Kleines Leerzeichen Problem

Posted: 2007-12-03 22:59
by daemotron
Alternative zu Roger Wilcos Vorschlag:

Code: Select all

if (( $i > 2)); then
    DATEIEN[(($i-2))]=""$1""
fi
shift
So werden die Dateinamen im String von doppelten Anführungszeichen umschlossen und das Zip-Programm müsste die Dateinamen korrekt erkennen, auch wenn Leerzeichen enthalten sind.

Re: Bash Script: Kleines Leerzeichen Problem

Posted: 2007-12-03 23:09
by cotterley
@jfreund
@Roger Wilco

Beide eurer Varianten bringen folgende Fehlmeldungen:

Code: Select all

zip warning: name not matched: "katze
zip warning: name not matched: 2.jpg"
zip warning: name not matched: "maus.jpg"
zip warning: name not matched: "hund.jpg"
Scheint so, als würde das Zip Programm auf einmal nach den " suchen. :cry: Soweit war ich leider auch schon mal, hatte vergessen es oben zu erwähnen. Dann werde ich mir noch mal die Links von Joe ansehen müssen. Vielleicht hat ja noch jemanden einen Tipp, wonach ich genau suchen muss. ;)

EDIT: Das Zip Programm kann aber auf jedem Fall die "-umschlossenen Parameter verstehen. Gebe ich es direkt auf der Konsole so ein, dann funktioniert es.

Re: Bash Script: Kleines Leerzeichen Problem

Posted: 2007-12-04 08:51
by juergen
Hmm.. Das geht doch einfacher:

Code: Select all

DATEIEN=("${@:3:${#@}}")

zip -r -z < /tmp/kommentar.txt ${zipname} "${DATEIEN[@]}"

Re: Bash Script: Kleines Leerzeichen Problem

Posted: 2007-12-05 14:38
by cotterley
Danke juergen.

Deine Variante ist wirklich viel schöner als meine und das Beste ist: Sie funktioniert. Danke! :)