• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Verständnisfrage zu: if then else fi

roemi

Advanced Hacker
Code:
if [ -r eins.txt ]  #Zeile1
then
  v_ziel=zwei
fi

echo $v_ziel
                               #Zeile7

Die Antwort lautet:
backup2.sh: 7: Syntax error: end of file unexpected (expecting "then")

Moin!
Oben gezeigtes Script will ich durchführen lassen (natürlich komplexer) aber ich scheitere bereits bei diesen 6 Zeilen :???:
m.E. sollte es funktionieren. Tut es aber nicht. In Zeile 1 frage ich ab, ob eine Datei existiert und für Zeile 7 nörgelt er über ein fehlendes "then".
Mal wieder wird es nur ein Klacks sein ... vermutlich.
 

josef-wien

Ultimate Guru
Ich nehme an, die Datei ist nicht im UNIX-Format gespeichert (sondern im Windows-/DOS- oder Macintosh-Format).

Außerdem hat in der ersten Zeile die zu verwendende shell definiert zu werden, z. B.:
Code:
#!/bin/bash
 
A

Anonymous

Gast
Sicher , das es genau so dort seht und nicht etwa ;)
Code:
if [ -r eins.txt ]  #Zeile1
then
  v_ziel=zwei
if

echo $v_ziel
                               #Zeile7


robi
 

RME

Advanced Hacker
Hallo,

Habe schnell folgendes script getestet -- funktioniert bestens.

Code:
#!/bin/bash

v_ziel=eins

if [ -r eins.txt ]
then
  v_ziel=zwei
fi

echo $v_ziel

# -/-
Gruss,
Roland
 
OP
roemi

roemi

Advanced Hacker
Erstmal Danke!

@RME: Vielleicht habe ich was an den Augen, aber worin unterscheiden sich unsere Scripts ;) ;)
@robi: Jepp, kein if sonder ein fi steht am ende ;)
@josef-wien: Nix Windows

Oki, war gerade joggen und hab derweil überlegt was der unterschied zu einem ursprünglich mal funktionieren Script ist.
Keiner. Evtl. habe ich aber mal was installiert und das verübelt die Kiste mir nun!?!?

Ich lasse gerade mal ein apt-get -u upgrade laufen. Mal schaun.
 
OP
roemi

roemi

Advanced Hacker
Sodele, upgrade hat natürlich nichts gebracht.

@Roland: Habe nun Dein Script kopiert und eingefügt.
Resultat
backup2.sh: 12: Syntax error: end of file unexpected (expecting "then")

:???:
 
Hi Roemi,

hast Du vielleicht deinen Text unter Windows editiert?
Dann wäre das Zeilenende ein <cr><lf> statt nur ein <lf>
od -xc "script" zeigt die den Inhalt Hexadezimal und als Zeichen an. Damit kannst Du hereuasfinden,
ob ein <0d><0a> (cr,lf) oder nur ein <0a> (lf) am Ende der Zeilen steht.
man ascii zeigt dir die Zuordnung wert <=> Zeichen an.

Das fällt nicht allen Editoren auf, bash aber schon.

Mit bash -n "script" kannst Du die Syntax checken, ohne dass etwas ausgeführt wird.
Haveaniceday
 

RME

Advanced Hacker
Ich vermute das Problem liegt weiter oben im Script... irgend noch ein offenes if, while, etc.

Roland
 
OP
roemi

roemi

Advanced Hacker
Hallo,

nein ... die Datei ist nicht per Windows erzeugt worden. Wohl aber mit dem Editor von Webmin.
Also schaue ich da mal.

Das Script besteht z.Z. nur aus den hier gezeigten Zeilen. :???:
 
OP
roemi

roemi

Advanced Hacker
Langsam wird es ... darum ein Bild. denn ein Bild sagt mehr als tausend Worte.

linux.JPG
 

RME

Advanced Hacker
Hier sind meine octal dumps:

***
Edit: folgendes ist das Script ohne "then" -- sorry (siehe weiter unten für das korrekte Script).
***

Code:
> od -a test_script
0000000   #   !   /   b   i   n   /   b   a   s   h  nl  nl   v   _   z
0000020   i   e   l   =   e   i   n   s  nl  nl   i   f  sp   [  sp   -
0000040   r  sp   e   i   n   s   .   t   x   t  sp   ]  nl  nl  sp  sp
0000060   v   _   z   i   e   l   =   z   w   e   i  nl   f   i  nl  nl
0000100   e   c   h   o  sp   $   v   _   z   i   e   l  nl  nl   #  sp
0000120   -   /   -  nl
0000124
>
> od -b test_script
0000000 043 041 057 142 151 156 057 142 141 163 150 012 012 166 137 172
0000020 151 145 154 075 145 151 156 163 012 012 151 146 040 133 040 055
0000040 162 040 145 151 156 163 056 164 170 164 040 135 012 012 040 040
0000060 166 137 172 151 145 154 075 172 167 145 151 012 146 151 012 012
0000100 145 143 150 157 040 044 166 137 172 151 145 154 012 012 043 040
0000120 055 057 055 012
0000124
~/RME/Work/Tmp2/ccc >

Roland
 
> od -a test_script
0000000 # ! / b i n / b a s h nl nl v _ z
0000020 i e l = e i n s nl nl i f sp [ sp -
0000040 r sp e i n s . t x t sp ] nl nl sp sp
0000060 v _ z i e l = z w e i nl f i nl nl
0000100 e c h o sp $ v _ z i e l nl nl # sp
0000120 - / - nl
0000124

Hmm, ich sehe da kein then... ich sehe:
Code:
#!/bin/bash

v_zie1=eins

if [ -r eins.txt ]

  v_ziel=zwei
fi

echo $v_ziel

# -/-
Füg mal ein then ein, dann gehts.
Haveaniceday
 

framp

Moderator
Teammitglied
@haveniceday: Bitte beide Ausgaben liefern (asccii und binaer) und bitte in Code tags :roll:
 
A

Anonymous

Gast
Code:
0000040   r  sp   e   i   n   s   .   t   x   t  sp   ]  nl  nl  sp  sp
0000060   v   _   z   i   e   l   =   z   w   e   i  nl   f   i  nl  nl
ich kann die Augen so groß machen wie ich will, ich sehe hier auch kein "then" in dem Oktaldump .

also bin ich mal mit deiner Bash der gleichen Meinung. ;)

robi
 

RME

Advanced Hacker
Sorry -- ich habe offenbar ein editiertes test Script gedumpt :eek:ps:

Hier nochmals:

Code:
> od -a test_script
0000000   #   !   /   b   i   n   /   b   a   s   h  nl  nl   v   _   z
0000020   i   e   l   =   e   i   n   s  nl  nl   i   f  sp   [  sp   -
0000040   r  sp   e   i   n   s   .   t   x   t  sp   ]  nl   t   h   e
0000060   n  nl  sp  sp   v   _   z   i   e   l   =   z   w   e   i  nl
0000100   f   i  nl  nl   e   c   h   o  sp   $   v   _   z   i   e   l
0000120  nl  nl   #  sp   -   /   -  nl
0000130
> od -b test_script
0000000 043 041 057 142 151 156 057 142 141 163 150 012 012 166 137 172
0000020 151 145 154 075 145 151 156 163 012 012 151 146 040 133 040 055
0000040 162 040 145 151 156 163 056 164 170 164 040 135 012 164 150 145
0000060 156 012 040 040 166 137 172 151 145 154 075 172 167 145 151 012
0000100 146 151 012 012 145 143 150 157 040 044 166 137 172 151 145 154
0000120 012 012 043 040 055 057 055 012
0000130
>

Roland
 
OP
roemi

roemi

Advanced Hacker
Ähhhhh ....

"octal dumps"

:???:

Klärt mich auf. Und ich sehe in meinem Script ein "then".
 
A

Anonymous

Gast
Am besten mal das Script mit dem vi öffenen, der zeigt dir dann schon die Sonderzeichen die du da eingeschleppt hast,
kann eigentlich nur sowas wir in dem folgenden Link sein, mit so was kann man verrückt werden. Das kommt aber davon wenn
man zu faul ist sich einen vernünftigen Editor für das Scriptschreiben anzugewöhnen.

http://www.linux-club.de/viewtopic.php?f=21&t=20480&hilit=huhn+robi&start=20

robi
 

RME

Advanced Hacker
Mit einem octal Dump ("od") kannst Du sehen aus was für Zeichen (bytes) Deine Datei effektiv besteht. Da ist dann:

Code:
'A' = 101 (octal Wert 101 = 1000001 binär = 65 dezimal)
'B' = 102 (octal Wert 102 = 1000010 binär = 66 dezimal)
...
'Z' = 132 (octal Wert 132 = 1011010 binär = 90 dezimal)
usw. -- für alle Zeichen gibt es einen ensprechenden octal Wert (0 bis 9, a-z, A-Z, auch alle Kontrolzeichen).

So ist dann:

Code:
ein Leerzeichen) = octal 040
ein Zeilen-Vorschub = octal 012
ein Zeilen-Rücklauf = octal 015
etc.

Siehe die manual page für:

Code:
> man od
> man ascii

Um also eine octal Representation Deines Scriptes zu erhalten gibst Du den Befehl:

Code:
> od -a Dateiname
-a --> ascii Zeichen Darstellung

Code:
> od -b Dateiname
-b --> binäre Darstellung

Mit einem octal Dump kannst Du dann auch sonst unsichtbare Zeichen sehen (z.B. Zeilen-Rücklauf).

Roland
 
OP
roemi

roemi

Advanced Hacker
0000000 # ! / b i n / b a s h cr nl v _ z
0000020 i e l = e i n s cr nl i f sp [ sp -
0000040 r sp t e s t sp ] cr nl t h e n cr nl
0000060 sp v _ z i e l = z w e i cr nl f i
0000100 cr nl e c h o sp $ v _ z i e l cr nl
0000120 # sp - / - cr nl
0000127

So, kann man daraus was erkennen? Für mich wirkt das etwas "spanisch". :D
 
Oben