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
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.
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:
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.
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.
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").