Unix Shell while mit Ausgabeumlenkung ?

I

itschi128

Grünschnabel
Hallöchen..

habe mich hier mal angemeldet weil ich gerade wirklich nicht weiterkomme

Habe folgendes einfaches Script:

i=1
n=10
while [ $i -le $n ]
do
cat FILE
i='expr $i + 1'
done

Alles wunderbar aber:

i=1
n=10
while [ $i -le $n ]
do
cat FILE >> FILE1
i='expr $i + 1'
done

funktioniert nicht..
Wie muss ich den Ausdruck mit der Ausgabeumlenkung schreiben ?
Die Shell sagt mir : bash: [: too many arguments

Danke schonmal im voraus :)
 
Zuletzt bearbeitet:
Habe folgendes einfaches Script:

i=1
n=10
while [ $i -le $n ]
do
cat FILE
i='expr $i + 1'
done

Alles wunderbar aber:

i=1
n=10
while [ $i -le $n ]
do
cat FILE >> FILE1
i='expr $i + 1'
done

funktioniert nicht..

Ohne zu wissen, was FILE ist, lassen sich weder die Funktionsweise noch der Fehler des Skriptes nachvollziehen. Vielleicht kannst Du dies noch erlaeutern. Sind dies Parameter?
 
FILE ist in diesem Fall eine einfache Textdatei
mit irgendwelchen ASCII Inhalten.
In diesem Fall soll also der Inhalt von FILE 10 mal an FILE1
angehängt werden.

Villeicht kann man dies auch anders lösen.

Es geht mir natürlich dabei um das Prinzip -
das ich das auch mit einem Editor könnte ist mir klar :)
 
rikola: erst denken, dann schreiben

itschi128: Dein fehler liegt nich in der while-zeile sonder das expr
Code:
i=`expr ${i} + 1`

So muss das aussehen, dann gehts auch...

regards
Manuel
 
Hallo

Und weil expr ein externer Prozess ist, wird ein
innerhalb einer bash oder ksh mindestens 10 x schneller sein.
Nur mal so ein kleiner Vergleich auf meiner alten Kiste:
wolle@Nietzsche:~/temp
$ i=0; time while [ $i -lt 10000 ]; do echo $i;((i++));done>/dev/null

real 0m0.778s
user 0m0.751s
sys 0m0.026s

wolle@Nietzsche:~/temp
$ i=0;time while [ $i -lt 10000 ]; do echo $i;i=$(expr $i + 1);done>/dev/null

real 0m36.410s
user 0m10.602s
sys 0m25.795s

wolle@Nietzsche:~/temp
Darum verwende immer da wo du expr schreiben willst, besser oben genannte Methode. (das gilt natürlich nur für die Shelltypen, die das unterstützen)
Du kannst natürlich auch
benutzen.
Die Backticks sollte man eigentlich heute nicht mehr verwenden.
Um 10 x eine Datei in ein Target zu pipen, geht auch
Code:
for i in $(seq 10); do cat inputfile;done >output-file

Gruß Wolfgang
 
Schönen Dank erstmal :)

@caba:
Die Variable selbst in geschweifte Klammern zu schreiben hat bei
meinem Fall den Fehler nicht behoben.. es kam die gleiche Meldung der Bash

@Wolfgang;
Dein Weg erst mit der for Schleife die Daten zu "sammeln" und dann in die
output File zu schreiben war genau richtig .. klappt wunderbar
..weiß nicht ob ich da irgendwann drauf gekommen wäre :))
 
@caba:
Die Variable selbst in geschweifte Klammern zu schreiben hat bei
meinem Fall den Fehler nicht behoben.. es kam die gleiche Meldung der Bash
Der Vorschlag bezog sich nicht auf die geschweiften Klammern, sondern auf die Art der einfachen Anfuehrungszeichen: Du hast ' benutzt, waehrend es ` sein sollte.

@Wolfgang:
gute Tips! Weswegen sollte man backticks nicht mehr benutzen? Auch aus Leistungsgruenden? Und wie macht man es besser - runde Klammern?
 
Hallo
@Wolfgang:
gute Tips! Weswegen sollte man backticks nicht mehr benutzen? Auch aus Leistungsgruenden? Und wie macht man es besser - runde Klammern?

Nicht aus Performancegründen, sondern um genau das was du meintest zu vermeiden.

Der Vorschlag bezog sich nicht auf die geschweiften Klammern, sondern auf die Art der einfachen Anfuehrungszeichen: Du hast ' benutzt, waehrend es ` sein sollte.

Benutze statt Backticks
Code:
B=`echo $a`
#besser
B=$(echo $a)
Meine persönliche Meinung dazu:
Mir ist klar, dass vielfach keinen Wert mehr auf Performance gelegt wird, aber ich habe es als guten Stil und alter Zeit so gelernt.
Bei Einzeilern mag das mancmal egal sein. Aber wenn man sich das gleich richtig angewöhnt, passiert es auch bei größeren Prozessen nicht mehr solch Resourcen zu verschleudern. Da kann und ist es dann wichtig.

Gruß Wolfgang
 
@caba:
Die Variable selbst in geschweifte Klammern zu schreiben hat bei
meinem Fall den Fehler nicht behoben.. es kam die gleiche Meldung der Bash

Die geschweiften klammern waren nur ne Service-Leistung von mir.... :)
Nicht die eigentliche Problembehebung.

und Wolfgang hat natürlich recht:
Code:
FOO=$(expr ...)
ist natürlich besser
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Summe von Zahlen in einer Zeilen bilden

HandbrakeCLI Shell Skript

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Shellskript - Fehler in Cron

Zurück
Oben