Forum: PC-Programmierung Shell Skript Schleife, Wie ?


von anton (Gast)


Lesenswert?

Hallo,
ich versuche mein erstes Script für die Linux Shell zu erstellen. Habe 
vorher nur mit VB gearbeitet. Wie ihr sicher sehen könnt fällt mir die 
umgewöhnung schwer. Aber hier mein versuch.

Besonders ungewohnt scheint hier für mich der Umgang mit Variablen zu 
sein.

Das Programm erwartet als erstes eine Benutzereingabe einer Zahl, und in 
einer Schleife soll dann von 0 bis zur eingabezahl gezählt werden.
1
1  #!/bin/bash
2
2  read -p "Zahl: " z                      # Hier wird eine Zahl eingegeben!
3
3  echo "Es wird bis " ${z} "gezaehlt"     # Ausgabe Anzahl der       Schleifendurchlaefe...
4
4  i=0                                     # Zaehler (i) auf 0 setzen
5
5  until $i -eq $z                         # Until Schleife, Durchlaufen bis bed. Erfuellt
6
6  do                                      # ? Schleifenbeginn
7
7  i = ${$i+1}                             # Zaehler Inkrementieren
8
8  echo ${i}                               # Aktuellen Zaehlerstand ausgeben
9
9 done                                    # Zuruek zum Schleifenanfang
10
10 echo "Fertig!"                          # Fertig

Bis zur Zeile 3 läuft es, kommen folgende Fehler:
1
ich@testrechner ~ $ sh test.sh
2
Zahl: 3
3
Es wird bis  3 gezaehlt
4
test.sh: 5: test.sh: 0: not found
5
test.sh: 7: test.sh: Bad substitution

kann mir jemand sagen wo der fehler liegt? OS ist Ubuntu 12.10
ich z.b. schon versucht in zeile 5 das $ wegzunehmen, aber dann kommt 
ein fehler das z.b. i nicht gefunden wurde...

danke im vorraus anton

von Tom (Gast)


Lesenswert?

Du hast die Testoperatoren vergessen
[$i -eq $z]
Bei deinem Code wird $i durch 0 ersetzt und versucht auszuführen, 
deswegen kommt auch die Fehlermeldung not found.

von Tom (Gast)


Lesenswert?

Achja, Leerzeichen vergessen
[ $i -eq $z ]

von Tom (Gast)


Lesenswert?


von anton (Gast)


Lesenswert?

Hallo Tom,

danke für die schnelle Antwortt.

Aber leider funktioniert leider auch nicht... jetzt kommt folgender 
fehler:
1
test.sh: 5: test.sh: 0: not found
2
test.sh: 7: test.sh: Bad substitution

System ist frisch aufgesetzt, hab noch nirgends Rumgefummelt.

Gruß anton

von anton (Gast)


Lesenswert?

anton schrieb:
> Hallo Tom,
>
> danke für die schnelle Antwortt.
>
> Aber leider funktioniert leider auch nicht... jetzt kommt folgender
> fehler:test.sh: 5: test.sh: 0: not found
> test.sh: 7: test.sh: Bad substitution
>
> System ist frisch aufgesetzt, hab noch nirgends Rumgefummelt.
>
> Gruß anton

So falschen fehler kopiert, hier richtig:
1
test.sh: 5: test.sh: [0: not found
2
test.sh: 7: test.sh: Bad substitution

von Rolf M. (rmagnus)


Lesenswert?

Tom schrieb:
> Achja, Leerzeichen vergessen
> [ $i -eq $z ]

Ja, die Leerzeichen sind wichtig, da es sich bei [ um nichts spezielles, 
sondern auch nur um ein Programm handelt, nämlich /usr/bin/[. $i ist 
dann der erste Kommandozeilen-Parameter, und der muß natürlich durch ein 
Leerzeichen getrennt sein. ] ist einfach der letzte 
Kommandozeilen-Parameter und muß deshalb auch durch ein Leerzeichen 
getrennt sein.

von anton (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Tom schrieb:
>> Achja, Leerzeichen vergessen
>> [ $i -eq $z ]
>
> Ja, die Leerzeichen sind wichtig, da es sich bei [ um nichts spezielles,
> sondern auch nur um ein Programm handelt, nämlich /usr/bin/[. $i ist
> dann der erste Kommandozeilen-Parameter, und der muß natürlich durch ein
> Leerzeichen getrennt sein. ] ist einfach der letzte
> Kommandozeilen-Parameter und muß deshalb auch durch ein Leerzeichen
> getrennt sein.

ahh, okay jetzt funktioniert das schoneimal. Danke,

schaue mir gerad den Link von Tom an, und versuche die Addition in Zeile 
7 hinzubekommen.

von anton (Gast)


Lesenswert?

Danke für eure Hilfe, es funktuiniert nun.

Ich poste den code hier nocheinmal für die eventuell Interressierte 
Nachwelt:
1
1  #!/bin/bash
2
2  read -p "Zahl: " z                      # Hier wird eine Zahl eingegeben!
3
3  echo "Es wird bis " ${z} "gezaehlt"     # Ausgabe Anzahl der      Schleifendurchlaefe...
4
4  i=0                                     # Zaehler (i) auf 0 setzen
5
5  until $i -eq $z                         # Until Schleife, Durchlaufen bis bed. Erfuellt
6
6  do                                      # ? Schleifenbeginn
7
7  i=`echo "$i + 1" | bc`                  # Zaehler Inkrementieren
8
8  echo ${i}                               # Aktuellen Zaehlerstand ausgeben
9
9  done                                    # Zuruek zum Schleifenanfang
10
10 echo "Fertig!"                          # Fertig

Zeile 7 wird nun mit dem BC-Rechner berechnet, der evtl installiert 
werden muss.

Danke für eure Hilfe, und eine angenehme Nachtruhe.

von Yalu X. (yalu) (Moderator)


Lesenswert?

anton schrieb:
> schaue mir gerad den Link von Tom an, und versuche die Addition in Zeile
> 7 hinzubekommen.

Arithmetik geht in der Bash mit $((...))
1
i=$((i+1))

In der Bash gibt es übrigens auch For-Schleifen (ähnlich wie in C):
1
#!/bin/bash
2
read -p "Zahl: " z
3
echo "Es wird bis $z gezaehlt"
4
for ((i=0; i<=$z; i++)); do
5
  echo $i
6
done
7
echo "Fertig!"

von Georg A. (georga)


Lesenswert?

> Arithmetik geht in der Bash mit $((...))

Es gibt aus den guten alten Basic-Zeiten auch noch den let-Befehl...

let c=$a*$b

Mehr siehe "help let"

von Norbert (Gast)


Lesenswert?

Bei der Bash geht's sogar noch einfacher:
1
value=25
2
let value=value+1
3
echo ${value}

Ergebnis:26

Ansonsten gerade beim Lernen immer wieder eine gute Idee:
Zweites Terminalfenster und
1
man bash

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

anton schrieb:

> Zeile 7 wird nun mit dem BC-Rechner berechnet, der evtl installiert
> werden muss.

bc ist hier eine Kanone auf den Spatz. Wer auf bashisms wie "let" 
verzichten will, nimmt expr. Das ist portabel und läuft auf jedem 
unixoiden System mit beliebiger Bourne-kompatibler Shell.

i=`expr $i + 1`

(Die merkwürdigen Hochkommas sind sog. "Backticks").

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.