Einstieg ins Bash scripting

Nordseebaer

Cadet 4th Year
Registriert
Apr. 2008
Beiträge
66
Hi,
wie der Betreff vermuten lässt, fange ich gerade damit an - und habe so problemchen. Meine Aufgabe ist ein Script zu erstellen, das vor jedem Dateinamen einen bestimmten String setzt. Irgendwie haute es ständig nicht hin, da es ständig zu Syntaxerror kam. Ok denke ich - ein super einfach Beispiel, das teste ich jetzt mal. Einfach mal alle Namen der im Verzeichnis befindlichen Textdateien ausgeben. Rausgekommen ist folgendes - ich poste hier hoffentlich alles wesentliche:
Code:
>cat fname.sh
#!/bin/bash

for filename in *.txt
do
echo "$filename"
done


echo Fertig!


>sh fname.sh
: command not found
: command not found
'name.sh: line 9: syntax error near unexpected token `do
'name.sh: line 9: `do
>

Was mach ich falsch? Ist es etwa schon zu spät heute?

​Danke schon mal.
 
das script ist soweit fehlerfrei, hast du in deiner umgebung evtl tatsächlich kein bash?
 
Ich habe auch die Vermutung, dass hier Windows irgendetwas reingezaubert hat.
Am besten bearbeitest du die Datei mal mit dem vi.

Unter Windows am besten zum Batchen Notepad++ nutzen.
 
Haha :D
Also ist wahrscheinlich die Codierung eine falsche?
Zur Erklärung: Das ganze ist für eine Praktikumsaufgabe. Ich selbst habe kein Linuxsystem installiert und die Rechner an der Uni sind unbenutzbar. Eine Console öffnen mag manchmal funktionieren - aber alle paar Minuten friert das System für ein paar Minuten ein.
Also logge ich mich via PuTTY ein, was auch gut läuft. Der einzige Editor für die Console ist VIM oder VI, mit dem ich absolut nicht umgehen kann. Dann habe ich das in Windows geschrieben und die Datei hochgeladen...

Habe jetzt auf UTF-8 umgestellt. Jetzt kommt die Fehlermeldung
>sh fname.sh
fname.sh: fame.sh: cannot execute binary file

Rechte sind gesetzt (775). Was ist jetzt kaputt?

Edit: ich bin zu lahm... unter windows nutze ich notepadd++
 
Der Grund für die Fehler wird sein: Windows Zeilenende (CR+LF) statt Unix (LF)

Daher, wie Maysi2k sagt, entweder direkt unter Linux zb. mit vim bearbeiten, oder unter Windows mit Notepad++ und darauf achten, dass das Zeilendende auf Unix gesetzt ist.

UTF8 ist nicht das Problem - wobei du jetzt wohl auf UTF8+BOM gestellt hast - das geht auch wieder nicht.
 
Ähm, was hindert dich, dir VirtualBox oder eine ähnliche freie Virtualisierungslösung zu installieren und dir in deinem Windows einfach ein Linux-System in einer VM aufzusetzen? Hast du etwa Angst, dass du nicht nur was lernen könntest, sondern dir Linux am Ende sogar noch gefallen könnte?
 
Hast du mal probiert, es einfach per ./fname.sh auszuführen? Also ohne vorher per sh ne neue Shell zu starten. Bzw. läuft das Skript, wenn du die Befehle so eins zu eins in die Konsole eintippst?

Kannst auch mal schauen, was sich hinter sh verbirgt. Eventuell steckt da ne Shell hinter, die die Syntax von deinem Skript nicht versteht oder andersherum, /bin/bash ist auf irgendwas anderes gelinked.

PS: Du solltest dir auch eine Shell aussuchen, deren Syntax du lernen willst. Es gibt nämlich nicht nur eine Shell für linux und co und teilweise unterscheiden sich deren features doch erheblich.

PPS: Eine VM ist eine gute Idee. Brauchst dir da ja auch kein dickes Desktop Linux zu installieren.
 
Zuletzt bearbeitet:
Daaron schrieb:
Ähm, was hindert dich, dir VirtualBox oder eine ähnliche freie Virtualisierungslösung zu installieren und dir in deinem Windows einfach ein Linux-System in einer VM aufzusetzen? Hast du etwa Angst, dass du nicht nur was lernen könntest, sondern dir Linux am Ende sogar noch gefallen könnte?
Warum sollte ich das tun wenn das auch anders geht? Ich habe heute mit der Aufgabe begonnen und wollte eigentlich vorerst kein Linux System aufsetzen - auch nicht über Virtual Box. Das hat nix mit Lernunwilligkeit zu tun - sonst würde ich hier nicht nachfragen. Heißt nicht, dass ich es nicht irgendwann tun werde wenn ich weiter auf solche Probleme stoße. Aber die Antwort nützt jetzt bei meinem Problem nicht!

KillerCow schrieb:
Hast du mal probiert, es einfach per ./fname.sh auszuführen? Also ohne vorher per sh ne neue Shell zu starten. Bzw. läuft das Skript, wenn du die Befehle so eins zu eins in die Konsole eintippst?

Kannst auch mal schauen, was sich hinter sh verbirgt. Eventuell steckt da ne Shell hinter, die die Syntax von deinem Skript nicht versteht oder andersherum, /bin/bash ist auf irgendwas anderes gelinked.

PS: Du solltest dir auch eine Shell aussuchen, deren Syntax du lernen willst. Es gibt nämlich nicht nur eine Shell für linux und co und teilweise unterscheiden sich deren features doch erheblich.

PPS: Eine VM ist eine gute Idee. Brauchst dir da ja auch kein dickes Desktop Linux zu installieren.

Ja, habe ich. Auch mit ./fname.sh kommt die Meldung erneut.
Habe gerade mit cat fname.sh gesehen, dass am Anfang, also for #!/bin/bash komische Sonderzeichen ausgegeben werden. Ich werd wohl zum Erfolgreichen üben doch mal eine VM anschmeißen.

Habe einfach mal die Befehle der Reihe nach eingegeben, das lief

NUr aus interesse: Hatte mich erst verschrieben:
>for file in *.txt; do echo "$filename"; done
Die Ausgabe ist 6 mal die Datei test.txt - das ist die letzte im Verzeichnis. Ich habe ja nun eine nicht existierende Variable genommen - bzw. schein $filename den wert test.txt zu enthalten. Weiß einer auf die Schnelle wie das kommt oder wäre eine genauere Analyse nötig?
 
Diese komischen Sonderzeichen sind wie gesagt der UTF8-BOM (Byte Order Mark).

Und da du die Datei vermutlich bisher immernoch nicht zu UNIX LF Zeilenenden korrigiert hast, funktioniert auch der Rest nicht. Ich schreib es gern nocheinmal...
 
bu1137 schrieb:
Diese komischen Sonderzeichen sind wie gesagt der UTF8-BOM (Byte Order Mark).

Und da du die Datei vermutlich bisher immernoch nicht zu UNIX LF Zeilenenden korrigiert hast, funktioniert auch der Rest nicht. Ich schreib es gern nocheinmal...

In meinem NOtepad++ stehen folgende Dinge (u.a.) in der Stausleiste:
Unix Script file, UNIX (steht für Format Zeilenende (LF), eingestellt über Bearbeiten->Format Zeilenende) und UTF-8. Ich habe nicht UTF8-BOM eingestellt

Sry... mein Fehler. Es gibt den Punkt UTF-8 ohne BOM. Dann steht da ANSI as UTF-8. Die Datei war nur nicht kopiert---
Ergänzung ()

Und jetzt gehts. Nun kann ich weiterarbeiten -> Danke an alle! :daumen:
 
Es spielt schon eine Rolle, ob du unter Linux arbeitest oder nicht. Den ganzen BOM-Stress hättest du dir erspart, wenn du direkt mit einem Linux-basierten Tool gearbeitet hättest.
 
Zurück
Oben