# Gehe zu zeile in script?



## metalllike (17. August 2006)

Hallo zusammen.
Mal eine ganz dumme frage.
gibt es einen Befehl wie früher unter qBasic goto [zeile]

das script was ich (versuche) zu schreiben soll eigendlich nur eine sache immer wieder wiederholen, wenn der programmablauf beendet ist bzw wieder von vorne anfangen.
oder wie kann ich das realisieren?

Das script soll folgendes können:
1 ausgeben ---> was soll hinzugefügt werden
2 eingabe durch benutzer
3 ----> daten hinzufügen
4 ausgeben ----> die daten sind hinzugefügt
5 ausgeben --->möchten sie auserdem noch was hinzufügen?
6 ja/nein
7 bei ja gehe zu 1
8 bei nein ende.

Bis zeile 5 (bzw 6) habe ich alles fertig und  auch winderbar ohne probleme. nur weiß ich nicht wie ich zeile 7 realisieren kann. zeile 8 ist auch wieder klar. da zeile 6-8 mit while case ... geschrieben sind.

Gruß
Metalllike


----------



## SilentWarrior (18. August 2006)

Mit >> kannst du Daten an eine Datei anhängen, anstatt sie zu überschreiben. Oder suchst du was anderes?


----------



## deepthroat (18. August 2006)

Hi.





			
				metalllike hat gesagt.:
			
		

> Hallo zusammen.
> Mal eine ganz dumme frage.
> gibt es einen Befehl wie früher unter qBasic goto [zeile]


Also um diese Frage beantworten zu können, müßtest du erstmal sagen welche Shell du überhaupt programmierst. Bash? (t)csh? zsh?

Hast du denn keine Dokumentation für deine Shell installiert? Da steht das bestimmt alles drin. Für bash gibt es definitiv kein goto. goto ist böse!



			
				metalllike hat gesagt.:
			
		

> das script was ich (versuche) zu schreiben soll eigendlich nur eine sache immer wieder wiederholen, wenn der programmablauf beendet ist bzw wieder von vorne anfangen.
> oder wie kann ich das realisieren?


Mit einer Schleife, Funktionen und einer case Anweisung. Schau mal in die Dokumentation.

Gruß


----------



## Dennis Wronka (18. August 2006)

deepthroat hat gesagt.:
			
		

> .Für bash gibt es definitiv kein goto. goto ist böse!


So schlimm find ich goto eigentlich garnicht. Das gibt es ja selbst auf CPU-Ebene, in Assembler kann man z.B. mit JMP (und auch bedingt Jumps wie z.B. JNE) Codeteile ueberspringen.
Und ich koennte es im Moment auch garnicht so schlecht gebrauchen um eine Resume-Funktion in meine LFS-Scripts zu bauen.


----------



## RedWing (18. August 2006)

//OFFTOPIC



			
				deepthroat hat gesagt.:
			
		

> Für bash gibt es definitiv kein goto. goto ist böse!



Nur bedingt. 
Auszug aus /lib/modules/`uname -r`/build/Documentation/CodingStyle:


```
Chapter 6: Centralized exiting of functions

Albeit deprecated by some people, the equivalent of the goto statement is
used frequently by compilers in form of the unconditional jump instruction.

The goto statement comes in handy when a function exits from multiple
locations and some common work such as cleanup has to be done.

The rationale is:

- unconditional statements are easier to understand and follow
- nesting is reduced
- errors by not updating individual exit points when making
    modifications are prevented
- saves the compiler work to optimize redundant code away ;)

int fun(int a)
{
        int result = 0;
        char *buffer = kmalloc(SIZE);

        if (buffer == NULL)
                return -ENOMEM;

        if (condition1) {
                while (loop1) {
                        ...
                }
                result = 1;
                goto out;
        }
        ...
out:
        kfree(buffer);
        return result;
}
```

Gruß,
RedWing


----------



## deepthroat (18. August 2006)

Oh, hab ich nicht mit gerechnet das meine unbedachte Aussage gleich solche Wellen schlägt. 

Wenn man goto mit Bedacht einsetzt (und nicht als Ersatz für Funktionen bzw. Schleifen) dann hat es durchaus seine Berechtigung.

Gruß


----------



## Dennis Wronka (18. August 2006)

Na Du kannst froh sein, dass wir heut so gut drauf sind. Sonst waer naemlich schon laengst ein Lynchmob auf dem Weg zu Dir.


----------



## deepthroat (18. August 2006)

Dennis Wronka hat gesagt.:
			
		

> Na Du kannst froh sein, dass wir heut so gut drauf sind. Sonst waer naemlich schon laengst ein Lynchmob auf dem Weg zu Dir.


Puh, heute hab ich aber auch ein Schwein.  Obwohl den Strafzettel heute früh wo ich nur ganz kurz gehalten hab um Blumen zu kaufen fand ich nicht so toll...  

Gruß


----------



## metalllike (18. August 2006)

HILFE
Wow hab ja nie damit gerechnet das so viele antworten hier auflaufen.

Also um Klartext für mein "goto" rein zu bekommen
Zum einen ich benutze die Bash und zum Rest:

Ich will wenn der Benutzer das Script aufruft das erstmal überprüft wird ob er root ist.
FERTIG und .
Dannach soll der Benutzer eine Eingabe machen. Und hier wird´s schwierig.
Und zwar soll der Benutzer Domains anlegen können ohne sich die Finger wund zu tippen bis die DNS einträge die Apache configs gemacht wurden, Verzeichnisse für das www bla bla bla evtl noch postfix configurieren usw.
also soll wenn der Benutzer test.de eingibt, automatisch alle Eintärage und configs für test.de in allen Server die vorhanden sind vornehmen.
Alles läuft spitzen mäßig bis zum Programm ende. Allerdings soll das Programm nicht einfach beendet werden sonder erstmal die frage stellen ob eine Domain dem System hinzugefügt werden sollen. 
wenn ja dann wieder ab Eingabe der Domain und wieder durchführen. Und wenn er wieder zum ende kommt wieder fragen ob eine weitere Domain hinzugefügt werden soll...

Wird aber die letzte frage mit nein beantwortet soll das Programm beendet werden oder halt andere Sachen erledigen. z.b eine Domain wieder löschen... oder mir einen schönen Tag wünschen und mich nach meinem Namen fragen *lach*

Und da ich ganz früher mal qBasic programmiert habe kenne ich den Befehl GOTO. wusste jetzt nicht ob´s sowas auch für shell gibt. Und wenn ich das mit einer schleife programmiere? wie soll das aussehen?

Gruß
Metalllike


----------



## deepthroat (18. August 2006)

Wie gesagt solltest du dir ruhig mal die Handbücher bzw. den Advanced Bash-Scripting Guide zu Gemüte führen.

Bash besitzt für solche Auswahlmöglichkeiten ein extra Kommando:
	
	
	



```
PS3="Auswahl (1-3): "

select auswahl in "neue Domäne" "Domäne entfernen" "Ende"; do
  case $auswahl 
    1) new_domain ;;
    2) delete_domain ;;
    3) break;;
    *) echo "nicht unterstützte Auswahl: $REPLY" >&2 ;;
  esac
done
```
Gruß


----------



## metalllike (18. August 2006)

deepthroat hat gesagt.:
			
		

> Wie gesagt solltest du dir ruhig mal die Handbücher bzw. den Advanced Bash-Scripting Guide zu Gemüte führen.


HIMMEL!! wie lange braucht man und das alles zu lesen?! naja werde ich aber wohl nicht drum herum kommen.
ich habs jetzt in etwa so gelöst

```
while :
 		do
   			echo "What domain (whith tld you will add (cencel by pressing c):?"
   			read line # read: Zeile von StdIn einlesen
   			case "$line" in
			[cC]|[cC]encel) echo "Cenceled" exit
           		break;;
       			*) echo "The domain $line will now add to your System!"
touch /var/lib/named/master/$line
===schnipp
Bearbeitung des scripts und server restart und dann
	while :
 		do
   			echo "Would you like to add another domain:? y/n"
   			read line # read: Zeile von StdIn einlesen
   			case "$line" in
			[nN]|[nN]o) echo "Finish" 
           		break;;
       			[yY][yY]es) #hier zu zeile echo "What domain (whith tld you will add (cencel by pressing c):?" und weiter machen
			break;;
			esac
	done
```
wenn ich das mit return gestallten will... wie sage ich dann das er auf die zeile springen soll? gruß Metalllike


----------



## metalllike (18. August 2006)

also mir ist in der zwischenzeit schon etwas eingefallen.


```
anfang ()
[
====schnipp
]
anfang

while :
 	do
   		echo "Would you like to add another domain:? y/n"
   		read line # read: Zeile von StdIn einlesen
   		case "$line" in
		[n]) echo "Okay. Program wil be stop now" 
       		break;;
      		[y]) anfang
		break;;
		*) echo "$line is not an accept comment" 
		break;;
	esac
  done
====schnipp
```

Und siehe da es funktiniert. aber leider nur ein mal.....
und wie bekomme ich das hin das er mich immer fragt wenn die funktion anfang zuende ist... wenn ich zb. 40 domains hab die ich hinzufügen will?
ich glaube nicht das es sinn macht das script 20 mal zu starten oder? *lach*

Gruß
Metalllike


----------



## deepthroat (21. August 2006)

metalllike hat gesagt.:
			
		

> und wie bekomme ich das hin das er mich immer fragt wenn die funktion anfang zuende ist...


Nimm einfach die break Statements raus - die führen dazu das die Schleife abgebrochen wird. Die doppelten Anführungszeichen sind die Markierung für das Ende einer case-Verzweigung... 

Gruß


----------

