Zählen in einem Shellscript

E

edi38

Mitglied
Thread Starter
Dabei seit
01.02.2004
Beiträge
94
Reaktionspunkte
0
Hallo zusammen,

wie kann ich einem Shellscript eine Variable um 1 erhöhen? Also so wie $i++.
 
Hab in einem alten Unix-Handbuch folgende Möglichkeit gefunden:

#!/bin/sh

i='1'
for file
do
echo $i $file
i='expr $i + 1'
done

Leider kann MacOSX 10.3.2 den Ausdruck 'expr' nicht.

Hat jemand einen Vorschlag?
 
hallo zusammen,

natürlich kann OS X den Ausdruck "expr"
warum soll der Panther das nicht können ?
 
Hallo maceis,

wenn ich das Script wie gepostet startet, dann bekomme ich folgende Ausgabe:

expr $i + 1 Documents
expr $i + 1 Library
expr $i + 1 Movies
expr $i + 1 Music
expr $i + 1 Pictures
...

Was mache ich falsch?
 
hallo nochmal

hier ist eine mögliche Lösung (tcsh, andere müssten auch gehen):
saturn:~] maceis% set i=1
[saturn:~] maceis% echo $i
1
[saturn:~] maceis% set i=`expr $i + 1`
[saturn:~] maceis% echo $i
2
[saturn:~] maceis%
 
Irgendwas klappt nicht. Habe jetzt den Code wie folgt

#!/bin/sh

set i=1
for file
do
echo $i $file
set i='expr $i + 1'
done

Ich starte mit: ./test.sh *

Ergebnis:
i=1

Das ist alles.
 
hallo edi,
das problem liegt wohl in der Anwendung der for Schleife

hast du meine Schnipsel mal probiert ?

Was willst du eigentlich genau erreichen ?
 
Das Ziel ist folgendes:

Ich bekomme von einem Kunden Bilder geschickt, die fuer eine Shop-System in ein bestimmtes Verzeichnis kopiert werden und dann mit einer DB verlinkt werden. Die Dateinamen sind irgendwelche 12-stelligen Zahlenkombinationen (wahrscheinlich von einer Digitalkamera). Ich moechte nun die Bilder fortlaufend umbenennen. Also 0001.gif, 0002.gif, etc.. Wenn nun neue Bilder vom Kunden kommen, sehe ich im Verzeichnis sofort, welche Files neu sind. Auch sind die Datenbankeintraege dann nachvollziehbarer und ich muss nicht jedesmal diese lange Zahl notieren.

Am Besten waere folgendes für den Dateinamen:

$i_konstanter_text.gif

wobei $i aufsteigend verlaeuft.

Vielen Dank fuer Deine Hilfe soweit.
 
probier mal das aus:

#!/bin/sh
# Skript macuser
# addiere 1 zu der Variablen i

echo "Geben Sie die Variable i ein (Ganzzahl)"
read i
echo $i
i=`expr $i + 1`
echo $i



Testlauf:
[saturn:~/bin] maceis% ./macuser
Geben Sie die Variable i ein (Ganzzahl)
15
15
16

[saturn:~/bin] maceis%

Eingaben sind blau, Programmausgaben rot
 
okay, wieviel Zeit hast du ?
 
Dein Script funzt wunderbar. Du hast also Recht, es liegt an der "for"-Schleife. Hast Du das Script, welches ich gepostet habe, mal gestartet? Kommt bei Dir das selbe Ergebnis. Ich denke, ja.
 
Wenn ich das Problem bis morgen Abend geloest habe, ist noch alles OK.
 
ich habs gleich -
bin am testen :D
 
Hallo edi38,

hier die Lösung:
Du machst zwei Verzeichnisse in einem gemeinsamen Verzeichnis

eins heisst kunde, da liegen die Dateien die der Kunde bereitsellt
Die Dateinamen sind egal.

die andere heisst shop
da kommen die Dateien mit neuem Namen rein,
der baut sich so auf
<fortlaufende Nummer>.name.gif (kannst du noch anpassen)

hier das Skript:

#!/bin/sh
# mac.sh
# Dateien umbenennen und verschieben bzw. kopieren
#
# hier statt "kunde" den absoluten Pfad angeben
cd kunde
shop=1
for kunde in `ls`
do
#
# Verschieben
# mv $kunde ../shop/$shop.name.gif
#
# Kopieren
cp $kunde ../shop/$shop.name.gif
#
shop=`expr $shop + 1`
done


durch Ändern der Komentare kannst du beeinflussen, ob die Dateien verschoben oder nur kopiert werden.
 
YEPP! Es funzt! Tausend Dank!!! Der Mann an den Drums drumm hats wieder hinbekommen! ;)

Aber woran hats den gelegen? Die Zeile

for kunde in `ls`

hats dann wohl gemacht?!
 
hallo eddi38 drumm

Aber woran hats den gelegen? Die Zeile
for kunde in `ls`
hats dann wohl gemacht?!

nicht nur:
es funktioniert folgendermaßen:

### wechsle in das Verzeichnis kunde, wo die Dateien liegen
# hier statt "kunde" den absoluten Pfad angeben
cd kunde
### hier initialisierts du die Variable $shop mit dem Wert "1"
shop=1
### hier beginnst du eine Schleife
### jeder Wert, den der Befehl (deswegen die backticks) ls ausgibt wird nacheinander
### in die Variable $kunde "gefüttert"
for kunde in `ls`
### hier beginnt die Anweisung
do
#
# Verschieben
# mv $kunde ../shop/$shop.name-neu.gif
#
# Kopieren
### kopiere <Wert von $kunde> nach "eine Ebene hoch"/shop/<Wert von $shop>.name-neu.gif
cp $kunde ../shop/$shop.name-neu.gif
#
### erhöhe den wert von $shop um eins
shop=`expr $shop + 1`
### Ende der Anweisung
### mach das solange, bis keine Werte mehr in der for ... in Schleife da sind
### dann höre auf
done

das wars :D
 
hallo nochmal drumm

man kann das Ganze auch noch ausbauen
z. B. indem man das Skript "fragen lässt", ob kopiert oder verschoben werden soll
oder, indem man anstelle des festen Namensbestandteils abfragt, wie der Name gebildelt werden soll.
Könnte dann so aussehn, dass beim Starten des Skripts die Frage erscheint:
"Wie heisst der Kunde ?"
und die Namen der Dateien für den Kunden Maier dann so aussehn:

1.maier.gif
2.maier.gif
3.maier.gif
....

und für den Kunden Müller

1.müller.gif
2.müller.gif
....

oder, dass für jeden Kunden ein unterverzeichnis mit seinam Namen angelegt wird.

Wenn du Lust hast, basteln wir noch weiter (morgen)
 
COOL! Das hört sich vielversprechend an!

Dann bis MORGEN!
 
So, schönen Abend zusammen zur zweiten Runde.

Hallo maceis!

Mit dem Script von Dir bin ich vollauf zufrieden. Jetzt ergibt sich für die Zukunft folgendes Problem (es wird nochmal harrig ;) ): Bilder von bestimmten Kunden werden auch anderen Kunden zur Verfügung gestellt. Das bedeutet ich brauche soetwas wie

01.mueller.gif
02.mueller.gif
...

wird

01.reuter.gif
02.reuter.gif
...

Kann ich also mit einem Shellscript innerhalb des Dateinames Veränderungen vornehmen? Reguläre Ausdrücke sind wahrscheinlich von nöten...

Man könnte jetzt natürlich sagen, na dann nimm doch einfach wieder die Originaldateien (128718498723.gif), aber dann muesste ich diese ja aufbewahren und Datenredundanz mag der Informatiker bekanntlich ja nicht. :p
 
hallo edi38,

das geht natürlich; das zauberwort heisst "sed"
auch "cut" und "awk" könnten evtl. vonnöten werden.

Lass mich mal ein wenig grübeln.

Hast du denn das Skript ein wenig weiterentwickelt?
Ich würde noch eine kleine Benutzerführung mit verschiedenen Optienen machen!
(mit read)
 
Zurück
Oben Unten