Bash Script: Kleines Leerzeichen Problem

Bash, Shell, PHP, Python, Perl, CGI
cotterley
Posts: 11
Joined: 2003-06-07 12:38

Bash Script: Kleines Leerzeichen Problem

Post 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:
User avatar
Joe User
Project Manager
Project Manager
Posts: 11173
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Bash Script: Kleines Leerzeichen Problem

Post by Joe User »

Roger Wilco
Posts: 5923
Joined: 2004-05-23 12:53

Re: Bash Script: Kleines Leerzeichen Problem

Post 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]}""
User avatar
daemotron
Administrator
Administrator
Posts: 2639
Joined: 2004-01-21 17:44

Re: Bash Script: Kleines Leerzeichen Problem

Post 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.
cotterley
Posts: 11
Joined: 2003-06-07 12:38

Re: Bash Script: Kleines Leerzeichen Problem

Post 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.
juergen
Posts: 133
Joined: 2004-03-30 14:44

Re: Bash Script: Kleines Leerzeichen Problem

Post by juergen »

Hmm.. Das geht doch einfacher:

Code: Select all

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

zip -r -z < /tmp/kommentar.txt ${zipname} "${DATEIEN[@]}"
cotterley
Posts: 11
Joined: 2003-06-07 12:38

Re: Bash Script: Kleines Leerzeichen Problem

Post by cotterley »

Danke juergen.

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