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: | #!/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
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
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: |
# ...
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
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Na, probier es doch einfach mal in so'nem Testprogrämmchen: | #!/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
Ehemalige
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
Anmeldungsdatum: 10. August 2005
Beiträge: 17599
Wohnort: Berlin
|
track schrieb: Na, probier es doch einfach mal in so'nem Testprogrämmchen: | #!/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.
| 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?
| cat > /tmp/dateie.txt
svoxE.sh /tmp/dateie.txt
rm /tmp/dateie.txt
|
oder
| 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
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
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 ☺
|