ubuntuusers.de

bash-scripting: Befehle erneut ausführen

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

Rosika

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo zusammen,

bei einem bestimmten Problem komme ich einfach nicht weiter. Ich habe mir ein Script geschrieben, das mir die installierten Programme anzeigt, die zu einem gewissen Datum installiert wurden. Dazu gebe ich einfach z.B. "Mär 12" ein, und alle damals installierten Programme werden angezeigt. Das funktioniert auch ganz prima, doch am Ende schließt sich wieder alles, und für eine weitere Abfrage muß ich das Script erneut starten.

Ich möchte erreichen, daß, bevor sich das Script beendet, eine Abfrage kommt, z.B.:

echo "Möchten Sie eine erneute Abfrage ausführen?"

. Bei "n" soll alles beeendet werden, bei "j" soll die bereits programmierte Routine erneut abgearbeitet werden. Ich habe im Internet schon recherchiert, komme aber nicht auf den Befehl, den ich dafür brauche. Vielleicht eine Schleife o.ä.? Kann mir jemand weiterhelfen?

Vielen Dank im voraus. Grüsse, Rosika 😐

P.S.: Hier noch mein Script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash

echo "Es werden die installierten Programme nach einem bestimmten Datum aufgelistet."
echo "Bitte geben Sie das gewünschte Datum ein."
echo "EINGABEFORMAT: Bsp.: Jan  5  oder Jan 12"
echo "Sie können aber auch nach Suchbegriffen suchen."
read dat
echo "Sie haben $dat eingegeben."
ls /var/lib/dpkg/info/ -cl | grep "$dat" > /home/rosika/Schreibtisch/Suchergebnisse
cd /home/rosika/Schreibtisch
gedit Suchergebnisse

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Sowas kann man mit einer Endlosschleife machen. Mal ein simples Beispiel anbei:

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

while [ true ]
do
  echo "banana"
  echo "(N)icht nochmal! (J)aaa, nochmal! ::> "
  read bla #Eingabe nach $bla einlesen
  echo;echo;echo; #drei Leerzeilen für die Optik
  case $bla in
    n|"") #falls n oder nix eingegeben wird beenden
      echo "Bye!"; break;;
    y|j|J|Y)
    echo Play again!;;
    *) #alle nicht vorher definierten Eingaben
    echo "I think you mean YES :)"
  esac
done

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo ChickenLipsRfun2eat,

Ich weiß nicht ob´s stimmt, aber ich denke, ich habe eine Lösung gefunden. Und zwar mit Hilfe einer while-Schleife. Dies hab´ ich ausprobiert, noch bevor Dein Beitrag kam. Es funktioniert wie gewünscht. Ich weiß nicht, ob ich´s richtig gemacht habe. Ich muß mir erst einmal Deinen Post genau durchlesen.

Hier mein Script:

 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
33
34
35
#!/bin/bash

while true
	do
		read -p "Programm starten? Eingabe: j, n :    " auswahl              
		case "$auswahl" in
			j) echo "Wählen Sie die Sprache aus: e für Englisch, d für Deutsch."         	 	
				read sprache  
				if [ $sprache = "e" ]
					then 
						echo "Bitte geben Sie den englischen Text ein."
						cd /tmp
						cat > dateie.txt
						svoxE.sh dateie.txt
						rm /tmp/dateie.txt
				fi	
				
				if [ $sprache = "d" ]
					then
						echo "Bitte geben Sie den deutschen Text ein."
						cd /tmp
						cat > dateid.txt
						svoxD.sh dateid.txt
						rm /tmp/dateid.txt
				fi
				
				  ;;
		        *) echo "Das Programm wird nun beendet."
                           break 
			   sleep 2.0
                                  ;;
		esac
done

sleep 2.0

Auf jeden Fall vielen Dank. Grüsse. Rosika

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Nachtrag:

Hab´ gerade gemerkt, daß sich mein gepostetes Script auf einen anderen Anwendungsfall bezieht, als das von meiner ursprünglichen Anfrage. Es geht dabei um den Aufruf des TTS_Programms pico2wave. Das Script bietet die Auswahl zwischen englischem und deutschem Text. Das nur zur Erklärung, falls jemand das Script tatsächlich durchlesen würde.

Grüsse. Rosika ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ja Rosika, dein Skript passt soweit.

Das was ChickenLipsRfun2eat geschrieben hat, ist zu sehr "mit der heißen Nadel" gestrickt, ist nicht ganz in Ordnung.
Also: bleib bei Deinem Eigenen, das ist besser, und vor allem auch sauberer.

LG,

track

p.s.:
Am Schluss bei solch einem Skript verwende ich gerne sowas:

1
2
3
4
5
6
7
8

# ...
echo bastel, bastel, ....
sleep 4

printf "Fertig.  \t\t [Taste]"
read -n1
echo

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo track,

vielen Dank für die Rückmeldung. Super! Das freut mich sehr, dass ich das so hinbekommen habe. Ich bin ja noch ganz neu beim Bash-Scripting. Von Deinen Links und Hinweisen, die Du mir letztens gegeben hast, konnte ich auch schon viele gebrauchen.

Danke nochmals und einen schönen Abend. Grüsse. Rosika ☺

P.S.: Leider kapier´ ich Deine Mitteilung unter P.S. noch nicht, obwohl ich mich anstrenge, sie zu verstehen. Schade. Doch ohne Erklärung bin ich wohl noch nicht soweit.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Na, probier es doch einfach mal in so'nem Testprogrämmchen:

1
2
3
4
5
6
7
8
#!/bin/bash

echo bastel, bastel, ....
sleep 4

printf "Fertig.  \t\t [Taste]"
read -n1
echo

dann siehst Du ja, was das macht: irgendwas basteln (hier natürlich nix außer dem Spruch), und dann auf einen Tastendruck warten.
Sozusagen als Alternative zu Deinem sleep am Ende, bevor das Skript endet (und das Terminal wieder zugeht).

Das war eigentlich alles.

LG,

track

Into_the_Pit Team-Icon

Ehemalige
Avatar von Into_the_Pit

Anmeldungsdatum:
25. Juni 2008

Beiträge: 9490

Wohnort: Bochum

Rosika schrieb:

Hier mein Script:

Eine kleine Anmerkungen von meiner Seite. Das

 cd /tmp 

würde ich ggfs. noch abfangen mit

 cd /tmp || exit 

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

track schrieb:

Na, probier es doch einfach mal in so'nem Testprogrämmchen:

1
2
3
4
5
6
7
8
#!/bin/bash

echo bastel, bastel, ....
sleep 4

printf "Fertig.  \t\t [Taste]"
read -n1
echo

dann siehst Du ja, was das macht: irgendwas basteln (hier natürlich nix außer dem Spruch), und dann auf einen Tastendruck warten.
Sozusagen als Alternative zu Deinem sleep am Ende, bevor das Skript endet (und das Terminal wieder zugeht).

Da read sowieso wartet - wozu das sleep 4 davor? 4 Sekunden sind ja eine Ewigkeit, wenn man das Programm schon kennt, und evtl. Textausgaben schon mal gelesen hat und kennt.

Und statt printf würde ich auch den -p (Prompt)-Parameter von read nehmen, siehe auch Rosikas Post.

1
2
3
4
	cd /tmp
	cat > dateie.txt
	svoxE.sh dateie.txt
	rm /tmp/dateie.txt

Das ist inkonsistent. Wieso wird bei rm der absolute Pfad verwendet, aber sonst nicht?

1
2
3
	cat > /tmp/dateie.txt
	svoxE.sh /tmp/dateie.txt
	rm /tmp/dateie.txt

oder

1
2
3
4
        dat=/tmp/dateie.txt
	cat > $dat
	svoxE.sh $dat
	rm $dat

In Skripten werden cds meist vermieden. Wenn man das in Verzweigungen macht wird schnell unübesichtlich, wo man sich unter welchen Bedingungen befindet. Beim Sourcen findet sich der Nutzer an überraschenden Orten wieder. Eine erschöpfende Diskussion dazu habe ich aber noch nirgends gelesen sondern es mir nur selbst zusammengereimt.

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo Into_the_Pit,

danke für den Hinweis. Ich bin immer bestrebt, etwas dazuzulernen. Deshalb die Frage:

 cd /tmp || exit

Was genau bedeutet "abfangen"? Und was ist der Vorteil davon? Ausserdem habe ich versucht herauszufinden, was genau eine doppelte Pipe macht. Was ist der Unterschied gegenüber einer einfachen Pipe? Ich habe darüber nichts gefunden.

Grüsse Rosika

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo user_unknown,

Das ist inkonsistent. Wieso wird bei rm der absolute Pfad verwendet, aber sonst nicht?

Da hast Du recht. Vielen Dank. Ich habe gerade erst mit Bash-Scripting angefangen und war froh, das gewünschte Script überhaupt hinbekommen zu haben. Ich denke, mit mehr Routine wird´s besser werden (hoffentlich). 😉

In Skripten werden cds meist vermieden.

Klasse, hab´ was dazugelernt. Danke.

Grüsse. Rosika

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo track,

danke für Deinen Post. Ich hab Dein Script mal laufen lassen. O.K., ich verstehe, erst nach dem einem beliebigen Tastendruck wird das Skript beendet. Aber darauf, wie man das schreibt, wäre ich nie gekommen. 😳

Grüsse. Rosika

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Rosika schrieb:

... darauf, wie man das schreibt, wäre ich nie gekommen. 😳

Ehrgeizig bist Du fast gar nicht, was ? 😊

Bist noch keine Woche dabei, und wunderst Dich, dass Dir nicht direkt das einfällt, was Andere mit vereinten Kräften so im Laufe von Jahren, und im Laufe vieler Diskussionen hier auf dem Forum sich ausgedacht und angewöhnt haben ... 😉

LG,

track

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

Rosika schrieb:

Hallo Into_the_Pit,

danke für den Hinweis. Ich bin immer bestrebt, etwas dazuzulernen. Deshalb die Frage:

 cd /tmp || exit

Was genau bedeutet "abfangen"? Und was ist der Vorteil davon? Ausserdem habe ich versucht herauszufinden, was genau eine doppelte Pipe macht. Was ist der Unterschied gegenüber einer einfachen Pipe? Ich habe darüber nichts gefunden.

Das Zeichen sieht zwar wie zweimal das Pipesymbol aus, ist aber ein kurzschließendes Oder. Wenn das erste Kommando ohne Fehler beendet wird, wird das zweite nicht ausgeführt, bzw. nur wenn das erste scheitert wird es ausgeführt.

Wenn also das cd tmp scheitert wird nichts gelöscht - es würde sonst nicht ins andere Verzeichnis wechseln und versuchen, im aktuellen Verzeichnis eine so benannte Datei zu löschen.

kurzschließendes Oder:

Das ist ein Ausdruck, bei dem der zweite Teil nicht ausgewertet wird, wenn der erste Wahr ist. Wenn ich sage: "Wenn es Januar ist oder Donnerstag esse ich Marzipan" kannst Du entscheiden, dass ich Marzipan esse, ohne zu prüfen ob Donnerstag ist, wenn Du weißt dass es Januar ist. Wenn man sich darauf verlassen kann, dass der zweite Ausdruck nicht ausgewertet wird, kann man dies als eine Art if-Verzweigung benutzen.

Ebenso gibt es ein kurzschließendes Und, bei dem der zweite Teil nicht ausgewertet wird, wenn der erste falsch ist, weil eine Und-Aussage falsch ist, wenn mindestens eine der Komponenten falsch ist.

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hi track,

hast ja recht. Ich wollte niemandem zu nahe treten. Es ist nur so, dass ich (noch) nicht so recht einschätzen kann, was ich bereits wissen müsste und was nicht. Naja, und was den Ehrgeiz angeht: Ich würde halt immer gerne alles verstehen, was in einem Script steht und wie alles funktioniert. Aber einsehen muss ich: ich bin noch nicht soweit. 😳

Auf jeden Fall: allerherzlichsten Dank, und ich werde Deine Beenden-Anweisung gerne in meine Scripts einbauen.

Viele Grüsse. Rosika ☺

Antworten |