Shell Skript Schleife, Wie ?

Gast #3128804
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
Gast #3128816
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
Gast #3128818
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
#3128822
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.
Gast #3128828
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.
Gast #3128845
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.
Moderator #3128849
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!"
Moderator Persönliche Seite #3129358
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").

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren