einfaches Skript will nicht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

einfaches Skript will nicht

Beitrag von Colttt » 01.09.2011 11:35:39

Hi,

kann mir wer verraten warum das nicht geht?

Code: Alles auswählen

#!/bin/sh

bla=0

while  $bla < 10  ;
        do
         $bla + 1
         echo $bla
done
Debian-Nutzer :D

ZABBIX Certified Specialist

Benutzeravatar
CH777
Beiträge: 1466
Registriert: 27.05.2008 16:37:17

Re: einfaches Skript will nicht

Beitrag von CH777 » 01.09.2011 12:41:53

Das geht nicht, weil die Syntax total falsch ist.
Eine ganz gute Übersicht gibt es z.B. hier: Advanced Bash Scripting

Benutzeravatar
debdog
Beiträge: 652
Registriert: 11.02.2007 10:53:12
Wohnort: Do,womrkoihochdeitschko

Re: einfaches Skript will nicht

Beitrag von debdog » 01.09.2011 15:35:54

Um die Suche im von CH777 genannten Link etwas zu vereinfachen:
Colttt hat geschrieben:

Code: Alles auswählen

$bla < 10
Für soche Vergleiche benötigt man das Werkzeug test. Kleiner Tipp: andere Schreibweise dafür ist [.
Colttt hat geschrieben:

Code: Alles auswählen

$bla + 1
Eine Änderung einer Variablen kommt einem Setzen gleich. Also muss diese Zeile mit einem bla= beginnen.

Meine Kenntnisse beschränken sich allerdings auf die bash. Also kommt es auch darauf an, was sich auf Deinem System hinter /bin/sh verbirgt.
Oben gemachte Angaben, Falls nicht anderweitig Erwähnt, beziehen sich auf Debian Stable (Squeeze) amd64.
"Die Einen glauben zu Wissen, die Anderen wissen zu Glauben."

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: einfaches Skript will nicht

Beitrag von Colttt » 02.09.2011 07:18:36

Code: Alles auswählen

#!/bin/sh

bla=0

while [ $bla -lt 10 ] ;
        do
         $bla=$bla + 1
         echo $bla
done
da bekomm ich dann:

Code: Alles auswählen

./gehts: 9: 0=0: not found
0
in einer endlosschleife..
Debian-Nutzer :D

ZABBIX Certified Specialist

Benutzeravatar
whisper
Beiträge: 3379
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: einfaches Skript will nicht

Beitrag von whisper » 02.09.2011 08:50:44

Code: Alles auswählen

#!/bin/bash

bla=0

while [ $bla -lt 10 ] 
        do
         bla=$(($bla + 1))
         echo $bla
done
Deine Syntax $bla= $bla + 1 ist perl oder php, wenn ich mich nicht irre :-)

Das semikolon kann auch weg, weil das do in einer neuen Zeile steht.
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

uname
Beiträge: 12419
Registriert: 03.06.2008 09:33:02

Re: einfaches Skript will nicht

Beitrag von uname » 02.09.2011 08:56:02

Geht aber auch z.B. so:

Code: Alles auswählen

#!/bin/bash

bla=0

while [ $bla -lt 10 ] 
        do
         let "bla+=1" 
         echo $bla
done
oder so

Code: Alles auswählen

#!/bin/bash

bla=0

while [ $bla -lt 10 ] 
        do
         bla=`expr $bla + 1` 
         echo $bla
done

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: einfaches Skript will nicht

Beitrag von Colttt » 02.09.2011 09:02:06

danke ihr beiden, da sich whisper mehr an emin beispiel anlehnt nehm ich das jetzt mal.. ;)

Code: Alles auswählen

bla=$(($bla + 1))
warum doppelklammern? und warum davor ein $ ?
Debian-Nutzer :D

ZABBIX Certified Specialist

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: einfaches Skript will nicht

Beitrag von Meillo » 02.09.2011 10:12:45

Colttt hat geschrieben:

Code: Alles auswählen

bla=$(($bla + 1))
warum doppelklammern? und warum davor ein $ ?
Das ist halt bash-Syntax. Die urspruengliche Bourne-Shell bot keine Arithmetik, man musste expr(1) verwenden. Spaeter kam dann das Builtin `let' und die bash-Arithmetik mit den Doppelklammern.


Alternativ kannst du die Schleife auch so realisieren:

Code: Alles auswählen

for i in 0 1 2 3 4 5 6 7 8 9 ; do
    echo $i
done
Oder wenn du seq(1) hast:

Code: Alles auswählen

for i in `seq 0 9` ; do
    echo $i
done
Use ed once in a while!

uname
Beiträge: 12419
Registriert: 03.06.2008 09:33:02

Re: einfaches Skript will nicht

Beitrag von uname » 02.09.2011 11:40:21

Mal zur Performance. Durchlauf von 1 bis 10.000 ohne Textausgabe (echo) auf Uralt-Hardware´. Also "expr" ist grausam langsam.

expr:

Code: Alles auswählen

date && ./test.sh && date
Fr 2. Sep 11:33:18 CEST 2011
Fr 2. Sep 11:33:56 CEST 2011
let:

Code: Alles auswählen

date && ./test.sh && date
Fr 2. Sep 11:35:38 CEST 2011
Fr 2. Sep 11:35:38 CEST 2011
$(()):

Code: Alles auswählen

date && ./test.sh && date
Fr 2. Sep 11:36:33 CEST 2011
Fr 2. Sep 11:36:34 CEST 2011

Benutzeravatar
whisper
Beiträge: 3379
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: einfaches Skript will nicht

Beitrag von whisper » 02.09.2011 11:56:40

weil expr normalerweise ein externes Progamm ist...
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: einfaches Skript will nicht

Beitrag von Colttt » 02.09.2011 12:22:53

@uname: misst man heutzutage nicht mit time?

also

Code: Alles auswählen

time ./test.sh
bis 30k

Code: Alles auswählen

mit $(()):
real    0m1.053s
user    0m1.032s
sys     0m0.020s

Code: Alles auswählen

mit expr:
real    0m36.476s
user    0m39.726s
sys     0m16.777s

Code: Alles auswählen

mit let:
real    0m1.176s
user    0m1.148s
sys     0m0.024s
Debian-Nutzer :D

ZABBIX Certified Specialist

uname
Beiträge: 12419
Registriert: 03.06.2008 09:33:02

Re: einfaches Skript will nicht

Beitrag von uname » 02.09.2011 12:44:13

Klar kenne ich Debiantime. Genauso wie ich eigentlich gewusst habe, dass expr zum Paket Debiancoreutils gehört.

Code: Alles auswählen

dpkg -S `which expr`
coreutils: /usr/bin/expr

Code: Alles auswählen

dpkg -S $(which expr)
coreutils: /usr/bin/expr

Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: einfaches Skript will nicht

Beitrag von JaKlaRo » 03.09.2011 09:24:40

Nur zur Ergänzung:

Code: Alles auswählen

for i in {0..9}; do
    echo "$i"
done
und

Code: Alles auswählen

i=0
while [ "$i" -lt 10 ]; do
    echo "$i"
    i=$[$i+1]
done
JaKlaRo
HP Pavilion dv600: Debian Testing, Fluxbox, KDE

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: einfaches Skript will nicht

Beitrag von rendegast » 03.09.2011 13:37:04

Code: Alles auswählen

$  i=0 ; time while [ $i -lt 200000 ]; do let i+=1; : ; done 

real    0m3.565s
user    0m3.448s
sys     0m0.112s


$ time for (( i=1 ; i<200000 ; i=i+1 )) ; do : ; done

real    0m1.850s
user    0m1.784s
sys     0m0.060s


$ time for i in $(seq 0 200000) ; do : ; done

real    0m1.125s
user    0m1.144s
sys     0m0.032s


$ time for i in {0..200000} ; do : ; done

real    0m0.902s
user    0m0.888s
sys     0m0.012s
let, (()) und {} funktionieren nicht in der posix-sh.

In der dash (posix-sh) ist die seq-Variante 4x schneller als in der bash.
Zuletzt geändert von rendegast am 03.09.2011 14:39:47, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: einfaches Skript will nicht

Beitrag von Meillo » 03.09.2011 14:09:52

Manchmal waer's besser man wuerde nicht immer nur auf die Performance schauen ...
Use ed once in a while!

Antworten