ubuntuusers.de

Syntaxfehler im Script, doch wieso?

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

Sarius

Anmeldungsdatum:
29. April 2016

Beiträge: 13

Schönen guten Tag, arbeite derzeit an einem Art "Quiz", ein kleines Script. Kenne mich da schon etwas aus, doch verstehe nicht, wieso derzeit dieser error kommt:

1
2
./quiz.sh: Zeile 30: Syntaxfehler beim unerwarteten Wort `)'
./quiz.sh: Zeile 30: `    "")'

Es liegt an fi / esac ... Doch die sind doch richtig gesetzt, oder nicht?? fi nach einer if-Anweisung esac nach case... :-/

Hier das Script: https://pastebin.com/RpW4CcWW

danke für Hilfen!! ☺

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

30 Zeilen, ruhig auch 100, ruhig hier in einen Codeblock setzen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
 
clear
echo willkommen!
read answer
case $answer in
    answer1)
        if [ -d "/home/" ]; then
            clear
            dialog --backtitle quiz --yesno "ja oder nein...?" 10 60
            answer=${?}
 
            if [ "$answer" -eq "255" ]
              then
                echo Ok!
                exit 255
            fi
 
            if [ "$answer" -eq "1" ]
              then
                echo Na gut...
                exit 255
            fi
 
            if [ "$answer" -eq "0" ]
              then
                echo Ok!
            fi
        fi
    "")
esac
exit

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

Casesblöcke mit ;; abschließen.

1
2
3
4
5
6
7
8
9
case $answer in
    answer1)
        foo
        bar
        ;;
    "")
        baz
        ;;
esac

Vielleicht kann man beim letzten Block drauf verzichten - nachlesen oder ausprobieren.

Sarius

(Themenstarter)

Anmeldungsdatum:
29. April 2016

Beiträge: 13

Oh stimmt, danke!

Jetzt habe ich noch folgendes: https://pastebin.com/zFmKmMC4

Wie mache ich, dass wenn Fehler kommt, das gleiche ab Zeile 2 nochmal passiert, also dass man noch eine Chance hat? Derzeit wird das Script einfach beendet... :-/

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

Das mit den Codeblöcken hast Du übersehen? Das ist doch auch für Dich einfacher!

30 Zeilen, ruhig auch 100, ruhig hier in einen Codeblock setzen:

1
2
3
4
5
6
7
8
9
function foobar {

   ... return true


   ... return false 
}

foobar || foobar

Sarius

(Themenstarter)

Anmeldungsdatum:
29. April 2016

Beiträge: 13

Jaaa 😛

https://pastebin.com/4aqwM6mD

Besser? 😀

Sarius

(Themenstarter)

Anmeldungsdatum:
29. April 2016

Beiträge: 13

hmm

Sarius

(Themenstarter)

Anmeldungsdatum:
29. April 2016

Beiträge: 13

....

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Was soll das, Deinen Strang zu bumpen ??

Wir haben Dich wiederholt gebeten, Deinen Code in einem Codeblock zu posten damit man mal die Übersicht und Syntax-Highlighting hat.
Aber Du bleibst hartnäckig bei Deinem Pastebin, und da steht dann auch noch unvollständiger Schrott drin, den man gar nicht testen kann.

Willst Du Deine Frage nicht mal vernünftig, nachvollziehbar stellen, anstatt uns hier anzumachen ?

LG,

track

Sarius

(Themenstarter)

Anmeldungsdatum:
29. April 2016

Beiträge: 13

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
    u*|U*)

		echo waehle
		read answer2
		case $answer2 in

			*)

				if [ -d "/home/$answer2" ]; then

					NOW=$(date +"%d-%m-%Y")
					if [ -d "/home/$answer2" ]; then

						echo "FEHLER!"

					else
						* * *

Ich will dass wenn "FEHLER" kommt das gleiche ab der 2. Zeile nochmal passiert. also dass man nochmal was eingeben kann..

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Nimm Dir doch einfach mal ein Blatt Papier und zeichne Dir die Logik, die Du haben willst, als Flussdiagramm auf.

Dann wirst Du sehr schnell sehen, wie Du die Schleifen zusammenstricken musst ...
(das ist nämlich der 1. Schritt, bevor Du anfängst zu coden !)

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13192

Sarius schrieb:

[Code]

Die starke Einrückung macht das Lesen schwer. Außerdem ist es kein komplettes Script. Und ein case mit nur einem Zweig mit *) ist sinnlos.

Ich will dass wenn "FEHLER" kommt das gleiche ab der 2. Zeile nochmal passiert. also dass man nochmal was eingeben kann..

Wie track bereits schrieb: poste bitte den echten Code. Vielleicht hilft auch die Lektüre von Richtig fragen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

Schreib den Code, der evtl. ein zweites Mal ausgeführt werden soll, in eine Funktion:

1
2
3
4
5
6
7
function foobar {

   ... return 0


   ... return 1 
}

Ruf diese mit einem Shortcut-Oder auf:

1
foobar || foobar

Im ganzen Satz:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash

function foobar {
	a=$((RANDOM%2))
	echo $a

	if (( a > 0 ))
	then
		echo ok
		return 0
	else
		echo Fehler
		return 1
	fi
}

foobar || foobar

True/false als Rückgabe funktioniert leider nicht. Wenn Du dieses Miniscript mehrmals aufrufst wird es entweder mit

1
2
3
4
5
6

./doppelfun.sh 
0
Fehler
0
Fehler

2x scheitern, oder

1
2
3
4
./doppelfun.sh 
1
ok

einmal gelingen, oder beim 2. Mal erst gelingen:

1
2
3
4
5
./doppelfun.sh 
0
Fehler
1
ok
Antworten |