ubuntuusers.de

Bashscript, Error (unerwartetes Dateiende)

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

TimeMen

Anmeldungsdatum:
16. April 2016

Beiträge: Zähle...

Hallo Community,

Bin dabei ein (etwas verwirrendes) Script zu schreiben, und bin eigentlich am Ende angelangt. Nach dem letzten "fi" habe ich eine Zeile weiter ein "exit" eingefügt um das Script zu beenden. Doch wenn ich es ausführe, bekomme ich im Terminal folgenden Error:

.: Zu diesem Namen gehört keine Adresse
./Ping.sh: Zeile 165: Syntax Fehler: Unerwartetes Dateiende

entweder steht in der letzten ein "exit" oder teilweise steht das exit sogar in Zeile 164...

Woran liegt das?

LG TimeMen

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Ohne dem abschliessenden exit funktioniert das Skript wie gewuenscht?

Wie sieht das Skript aus?

TimeMen

(Themenstarter)

Anmeldungsdatum:
16. April 2016

Beiträge: Zähle...

Ohne exit, sagt er mir das:

.: Zu diesem Namen gehört keine Adresse
./Ping.sh: Zeile 165: Syntax Fehler: Unerwartetes Dateiende.

Aber den ersten Teil des Errors dachte ich, könnte ich ausschließen, weil ich nichts dergleichen gefunden habe

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

TimeMen schrieb:

Hallo Community,

Bin dabei ein (etwas verwirrendes) Script zu schreiben,

Dann entwirre es! Funktionen mit sprechenden Namen sind Dein Freund.

und bin eigentlich am Ende angelangt. Nach dem letzten "fi" habe ich eine Zeile weiter ein "exit" eingefügt um das Script zu beenden.

Völlig überflüssig. Wenn das Script zuende ist, ist es zu Ende. Explizites Exit brauchst Du nur für vorzeitiges Beenden (und ist auch da nicht immer eine gute Idee).

Doch wenn ich es ausführe, bekomme ich im Terminal folgenden Error:

.: Zu diesem Namen gehört keine Adresse
./Ping.sh: Zeile 165: Syntax Fehler: Unerwartetes Dateiende

Kommt denn ein solitärer Punkt irgendwo vor?

Unerwartetes Dateiende weist auf eine fehlende, schließende Klammer hin bzw. ein fehlendes Schlüsselwort, das ein Struktur beendet (for - do - done, case - esac, if - fi).

Mit einem Syntaxhighlightening Editor die Klammern von hinten abklappern, und sehen ob bei der ersten, schließenden die erwartete, öffnende aufleuchtet.

entweder steht in der letzten ein "exit" oder teilweise steht das exit sogar in Zeile 164...

Oder teilweise?

Woran liegt das?

Die Datei mal unter Windows bearbeitet? Bei Windows-Zeilenenden kann die Zählung durcheinander geraten und auch sonst vieles schiefgehen.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

TimeMen schrieb:

...

.: Zu diesem Namen gehört keine Adresse
./Ping.sh: Zeile 165: Syntax Fehler: Unerwartetes Dateiende

... Tja, wie sollen wir Dein Problem erraten, wenn Du uns überhaupt nichts zu Deinem Skript verrätst ? # <🐸

Jedenfalls gibt die Allwissende Müllhalde nur den Hinweis, dass die 1. Fehlermeldung irgendwas mit ifconfig zu tun haben muss.

entweder steht in der letzten ein "exit" oder teilweise steht das exit sogar in Zeile 164...

Wie mein Vorredner auch schon sagt: das hat nix mit Deinem Problem zu tun, und ist sowieso eine Anfänger-Unsitte.

Die 2. Fehlermeldung ist typisch für eine fehlende Klammer, oder Gänsefüßchen oder irgend sowas am Ende. Irgend ein Tipp-Vergessens-Fehler.
Wir gucken uns gerne das Skript an, nur dafür müsstest Du es posten. Oder Du öffnest es mal mit Geany. Der zeigt fehlende Klammern usw. nämlich an.

LG,

track

TimeMen

(Themenstarter)

Anmeldungsdatum:
16. April 2016

Beiträge: 22

Hallo ☺

Sorry, war unterwegs, weswegen ich eure Antworten erst jetzt gelesen habe. Ist Kate ein Syntaxhighlightening Editor? Mit Kate arbeite ich echt gerne... 😀 Weiß auch nicht warum.

Auf Windows habe ich es nicht bearbeitet (Hab ich seit ein paar Monaten glücklicherweise nicht mehr). Aber kann es sein dass Pluma das auch ein wenig durcheinandergebracht haben könnte? Denn damit hatte ich es kurzzeitig geöffnet.

Danke für den Tipp mit Geany 👍

Wenn Geany das nicht findet, und ich den Fehler auch nicht finde (Dank euch weiß ich ja nun ungefähr wo ich suchen muss bzw. was 😀 ), dann schicke ich euch mal die Datei... Beziehungsweise den Inhalt 😀

Liebe Grüße, und danke schonmal ☺ TimeMen

PS: Am entwirren bin ich dran... Sollte mal ne alternative Lösung für das nicht endende if|elif|else Getue finden. Vielleicht die ganzen Befehlsreihen in extra Dateien schreiben, und die dann nur noch aufrufen. Dann wird die Fehlersuche auch einfacher 😀

// Edit Es lag an Pluma... Pluma hat mir das ein wenig durcheinandergeschmissen, aber ich dachte ich hätte alles wieder eingerückt. Hab da bloß falsch gedacht. Ein "else, exit und fi" sind nach vorne gerutscht und ich habe deswegen nicht gemerkt dass da dem einen "if" ein "fi" fehlt...

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

TimeMen schrieb:

... Sollte mal ne alternative Lösung für das nicht endende if|elif|else Getue finden.

Wenn Du immer die selbe Variable auf 1000 Möglichkeiten abfragst, dann ist case was für Dich ...

Vielleicht die ganzen Befehlsreihen in extra Dateien schreiben, und die dann nur noch aufrufen. Dann wird die Fehlersuche auch einfacher 😀

... äh, nee - es wird sicherlich nicht übersichtlicher, wenn Du den ganzen Kram auch noch auf 5 Dateien verteilst.
Das einzige, was echt hilft ist eine saubere Struktur. Und die entwickelst Du sinnigerweise vorher, auf 'nem Zettel Papier !

LG,

track

TimeMen

(Themenstarter)

Anmeldungsdatum:
16. April 2016

Beiträge: 22

Hai track,

Aber dann könnte man wenigstens den Fehler besser finden, wenn man das verteilt, oder? Denn wenn man das Script ausführt, und es dann an einer Stelle abbricht kann man meiner Meinung nach besser lokalisieren wo man jetzt am besten suchen muss.

Danke für den Tipp mit case, muss mir das unbedingt mal anschauen. Ich muss nichts alles 1000 mal abfragen, aber so 200-300 mal schon 😀

LG TimeMen

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13215

TimeMen schrieb:

Aber dann könnte man wenigstens den Fehler besser finden, wenn man das verteilt, oder? Denn wenn man das Script ausführt, und es dann an einer Stelle abbricht kann man meiner Meinung nach besser lokalisieren wo man jetzt am besten suchen muss.

Das halte ich für ein Gerücht: Du musst doch in mehrere Dateien schauen. Hast Du das Skript schon mal mit set -x ausführt? Das könnte einen sinnvollen Hinweis geben, wo es abbricht. Wie bereits gesagt wurde, ist das mit Sicherheit ein vergessenes schließendes Element - sei es Anführungsstrich, fi, eine schließende Klammer etc.

TimeMen

(Themenstarter)

Anmeldungsdatum:
16. April 2016

Beiträge: 22

Wie gesagt, Pluma hat mir meine Einrückungen verändert und ich habe gedacht mein If wäre beendet, aber das war das If im If. Kurz gesagt, ein Fi hat gefehlt, allerdings hat mir das Geany auch nicht "gesagt", oder wie auch immer das symbolisiert werden sollte.

Kann gut sein dass das ein Gerücht ist. Muss mir halt mal überlegen wie ich das geschickter löse.

LG TimeMen

@rklm tolles Profilbild 😀

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Bei langen, komplexen Scripten kannst Du die Teilaufgaben in Funktionen lösen (das sollte man immer) und dann Tests für die Funktionen schreiben, und kannst mit 2 Hauptfunktionen, test und main, entweder Deine Tests oder die Hauptfunktion laufen lassen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
fun1 () ...
fun2 () ...
fun3 () ...

main ()
{
  fun1 a b 
  fun2 
  fun1 b c 
  fun3 
}

test ()
{
  fun1 a b 
  fun1 b c 
  ...
}

#main 
test

Aber Klammernfehler kann man leichter finden, if-fi weiß ich nicht.

"Unerwartetes Dateiende" usw. sind Meldungen, die man sich mit der Zeit einprägt, um dann zu ahnen, woran es liegen könnte.

Außerdem kann man vermutete Ursachen durch Microtestprogramme prüfen.

1
2
3
4
5
6
7
8
echo "if (( a > 4 )) ; then echo gr vier ; else echo klgl vier ;" > a.sh
chmod a+x a.sh 
./a.sh
./a.sh: Zeile 2: Syntaxfehler: Unerwartetes Dateiende.

echo "fun () { echo ho; " > b.sh
bash ./b.sh
./b.sh: Zeile 2: Syntaxfehler: Unerwartetes Dateiende.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13215

user_unknown schrieb:

Außerdem kann man vermutete Ursachen durch Microtestprogramme prüfen.

Guter Vorschlag!

1
2
3
4
echo "if (( a > 4 )) ; then echo gr vier ; else echo klgl vier ;" > a.sh
chmod a+x a.sh 
./a.sh
./a.sh: Zeile 2: Syntaxfehler: Unerwartetes Dateiende.

Das kann man auch ohne Datei machen:

1
2
$ sh -nc "if (( a > 4 )) ; then echo gr vier ; else echo klgl vier ;"
sh: -c: line 1: syntax error: unexpected end of file
Antworten |