bashscript: command per nutzereingabe auswählen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
michaa7
Beiträge: 4929
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

bashscript: command per nutzereingabe auswählen

Beitrag von michaa7 » 14.01.2021 22:12:07

Ich habe mir zu Übungszwecken (musikalisch) eine soundfile in einzelne vlc-loops aufgeteilt. Dies funktioniert!

Ich möchte da aber nicht immer mit c&p commands aus einem textfile ins terminal kopieren (müssen), weil das viel zu viel störender Aufwand beim musizieren ist.

Ich würde mir gerne ein script basteln, welches die loopdefinitionen enthält. Diese sollen per Nutzereingabe ausgewählt werden (können). Mir ist klar, dass man in einem script per "read" eine Nutzereingabe abfragen kann. Mir ist vollkommen unklar wie ich eine nutzereingabe mit einem command verknüpfe, bzw die gefundenen Beispiele erschienen mir für meinen Fall nicht umsetzbar.

So schaut die Liste der commands aus, auf die ich per Nutzereingabe zugreifen will:
#!/bin/bash

datei="ein schönes soundfile.ext"

vlc "$datei" --start-time 0 --stop-time 36 --repeat
vlc "$datei" --start-time 36 --stop-time 66 --repeat
vlc "$datei" --start-time 66 --stop-time 120 --repeat
vlc "$datei" --start-time 120 --stop-time 142 --repeat
vlc "$datei" --start-time 142 --stop-time 180 --repeat
vlc "$datei" --start-time 180 --stop-time 205 --repeat
vlc "$datei" --start-time 205 --stop-time 237 --repeat
vlc "$datei" --start-time 246 --stop-time 279 --repeat
vlc "$datei" --start-time 279 --stop-time 310 --repeat
vlc "$datei" --start-time 310 --stop-time 333 --repeat
vlc "$datei" --start-time 333 --stop-time 366 --repeat
Das script funktioniert auch schon so. Nur wird halt einfach der erste loop gestartet, und ewig wiederholt, bis ich vlc schließe, dann spring das script zum nächsten loop.

Was ich erreichen möchte wäre eine Art Eingabe Schleife, in der ich beispielsweise "3" (ohne "") eingebe, und das script führt das dritte command aus ... und springt wieder zur abfrage und wartet darauf dass eventuell eine neue eingabe (eine andere Zahl für einen anderen loop oder "q" für "quitt") kommt.

Ja, mir ist klar, es gibt "for-" und "while-"schleifen,, aber ich blicke das nicht. Ich habe auch

http://www.shell-tips.com/bash/select-loop/

gefunden, und für jemanden der scripten kann ist vermutlich offensichtlich wie das für meine Zwecke hilfreich sein könnte. Für mich ist das chinesisch.Füt nen hinweis wie ich weiter käme wäre ich dankbar.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von heisenberg » 14.01.2021 22:23:40

Insgesamt fehlen Dir aktuell noch die Bash-Grundlagen. Es wäre wahrscheinlich hilfreich, sich da etwas einzuarbeiten(Siehe links oben). Ansonsten helfen Dir die Tips hier nicht viel:

https://www.nextop.de/linuxfibel/bashprog.htm
https://www.selflinux.org/selflinux/htm ... erung.html
http://openbook.rheinwerk-verlag.de/she ... ammierung/

Falls Du dazu fragen hast, frage gerne hier!

michaa7
Beiträge: 4929
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von michaa7 » 14.01.2021 23:36:01

heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.01.2021 22:23:40
Für Deine Art von Verknüpfung würde ich mit Arrays arbeiten:
...
steps=(0 36 66 ...)
steps ist mir vollkommen neu, werde ich mir anschauen.
heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.01.2021 22:23:40
...
# Die folgenden Ausgaben kann man natürlich auch noch in eine Schleife packen.
Damit bin ich gedanklich schon wieder halb verloren, weil ich hier den Eindruck bekomme, dass du mir zwei alternative Konzepte gleichzeitig beschreibst, ich schwimme ...
heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.01.2021 22:23:40
Ich habe das Beispiel jetzt mal derart formuliert, dass das Ende des einen Zeitindexes immer der Anfang des nächsten ist
Ich glaube ich verstehe andeutungsweise, wie das ablaufen könnte. Aber ich habe auch den eindruck, dass das so nur mit den steps funktioniert und keine zusätzlichen commands wie "pause" "play" "next" "quit" ausgelöst werden können.

Ist denn kein konstrukt möglich, welches nach folgendem schema funktioniert

1=command1
2=command2
3=command3
...
p=playerctl pause
s=playerctl start #(play)
...

read 3 -> $3 #führt command3 aus
heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.01.2021 22:23:40
Insgesamt fehlen Dir aktuell noch die Bash-Grundlagen. Es wäre wahrscheinlich hilfreich, sich da etwas einzuarbeiten. Ansonsten helfen Dir die Tips hier nicht viel.
Das würdest du nicht sagen wenn du wüßtest wieviel zeit ich darin bereits inverstiert habe. Für mich ist es immer wieder so dass die Distanz zwischen "Es ist wohl möglicherweise irgendwie so oder so ähnlich" und "so funktioniert das" durch keine Lernkurve überbrückbar ist, sondern beide Bereiche durch eine tiefe Kluft getrennt sind.

aber danke für deine Hinweise, mal schaun was es bringt ...
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von heisenberg » 14.01.2021 23:54:44

steps=(0 36 66 ...)
Das ist ein simples Array namens "steps" (Könnte auch rumpelstilzchen heissen) - eine Variable die viele Werte aufnehmen kann.
heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.01.2021 22:23:40
Insgesamt fehlen Dir aktuell noch die Bash-Grundlagen. Es wäre wahrscheinlich hilfreich, sich da etwas einzuarbeiten. Ansonsten helfen Dir die Tips hier nicht viel.
Das würdest du nicht sagen wenn du wüßtest wieviel Zeit ich darin bereits inverstiert habe. Für mich ist es immer wieder so dass die Distanz zwischen "Es ist wohl möglicherweise irgendwie so oder so ähnlich" und "so funktioniert das" durch keine Lernkurve überbrückbar ist, sondern beide Bereiche durch eine tiefe Kluft getrennt sind.
Ich kann gut nachvollziehen, dass das für Dich vielleicht hart ist. Sei Dir bewusst: Meine Sicht der Dinge ist halt die mit ~25 Jahren Erfahrung darin. Und nur weil ich Dir sage, dass Dir die Grundlagen fehlen, heisst das nicht dass Du bisher "nix" gemacht hast. Das durchbeissen gerade am Anfang ist schon auch nicht so einfach und wenn Du dran bleibst, dann wirst Du es definitiv schaffen. Aus meiner Erfahrung kann ich nur sagen: Das Durchbeissen bleibt, aber die Aufgaben werden grösser.

Ich wiederhole meine Empfehlungen also nochmal:

Schau Dir die verlinkten Tutorials an. Bastle mal ein bisschen rum mit if / while / case / ... Wenn Du mit den Grundkonstrukten etwas vertraut bist, dann wirst Du schon auch merken, wie Du sie anwenden kannst. Es ist vielleicht auch schon sehr frustrierend, wenn man sich ein zu grosses Stück abbeisst, sprich, sich eine Aufgabe vornimmt, obwohl man noch zu wenig Fähigkeiten dafür hat. Also: Nicht zu viel auf einmal versuchen!

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von smutbert » 15.01.2021 00:41:26

Ich hätte ja schon ein Beispiel gepostet, aber du hast ja selbst schon eine Seite mit einem gut zu deinem Problem passenden Beispiel verlinkt:

Code: Alles auswählen

select filename in *;
do
	echo "You selected $filename ($REPLY)"
	break;
done
* wird wie bei anderen Befehlen zu einer Liste der Dateien im aktuellen Verzeichnis. Du bekommst in diesem Beispiel also eine Liste der Dateien angezeigt zwischen denen du wählen kannst und erhältst als Ausgabe mittels echo dann den gewählten Dateinamen und die Nummer der Auswahl ($REPLY) und break beendet die Schleife und damit das Programm.

Im Grunde musst du also nur * durch eine Liste der Befehle ersetzen und statt den Befehl mit echo auszugeben, führst du ihn aus.

Versuch es vielleicht zuerst mit einer Liste aus drei einfachen Befehlen wie ls, whoami und exit
Keiner der drei Befehle hat ein Leezreichen oder anderes Zeichen, das eine besondere Behandlung erfordern würde, was die Sache möglicherweise vereinfacht und mit drei Befehlen sollte das ganze auch noch recht übersichtlich bleiben.

michaa7
Beiträge: 4929
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von michaa7 » 15.01.2021 02:24:52

heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.01.2021 23:54:44
....Es ist vielleicht auch schon sehr frustrierend, wenn man sich ein zu grosses Stück abbeisst, sprich, sich eine Aufgabe vornimmt, obwohl man noch zu wenig Fähigkeiten dafür hat. Also: Nicht zu viel auf einmal versuchen!
Kurz bevor ich ins Bette gehe möchte ich etwas dazu sagen: Ich nutze Linux seit mehr als 15 Jahren:
Registriert:12.12.2004 00:46:49
. Ich habe endlose Zeit damit verbracht und ganz sicher sehr viel gelernt, aber viel weniger als es mein Aufwand rechtfertigen kann. Das ist das frustrierende. Und sosehr mich die ganze Computerei auch interessiert, das ist nicht was ich wirklich will. Und sosehr ich nachvollziehen kann dass ein Forum kein Empfangsschalter ist für die Erfüllung der Wünsche derjenigen, die wie ich schon verstehen was möglich wäre, es selbst aber eben doch nicht können, sosehr bin ich andererseits eben doch froh um alles was ich quasi "gebrauchsnah/-fertig" vorgeschlagen bekomme.

Ich werde mir deine und smuberts Vorschläge und Hinweise morgen anschauen ... und sehen. Vielleicht komme ich ja weiter, und wenn nich werde ich trotzdem nicht bash studieren. Ich werde vielleicht nochmals doof fragen ... und vielleicht auch nicht ... und bekomme weitere info ... oder nich ...und werde einfach sehen ... und hoffen nicht zuviel Zeit zu investieren in etwas was mir Hilfe, nicht unangemessener Zeitverlust sein soll für etwas mir viel wichtigerem.

In diesem Sinne nehme ich eure Hilfe gerne und dankbar an.

nächtle ...
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: bashscript: command per nutzereingabe auswählen

Beitrag von heinz » 15.01.2021 12:46:39

Hallo michaa7,

ich hatte gerade lust und Zeit und hab Dir mal was zusammengebastelt, was tun sollte was Du moechtest.
Es ist leider umfangreicher geworden als ich urspruenglich beabsichtigt habe aber Scripten macht halt auch Spass... :D
Das Script benoetigt auch das Programm dialog um ein Menue anzuzeigen.
NoPaste-Eintrag41241

Wenn Dir das Menue zu haesslich ist, lade noch die Farbdatei runter und speichere sie im Selben Verzeichnis, wo auch das Script liegt unter dem Namen dialogrc oder erstelle eine Eigene nach Deinem Gusto.
NoPaste-Eintrag41242
(Nicht das meine Schoener waere aber ich steh nunmal auf dunkle Hintergruende...)


Gestartet wird das Script mit:

Code: Alles auswählen

scriptname.sh "dateiname der sounddatei"
Am selben Ort wo die Sounddatei liegt wird auch eine Text-Datei mit den Zeiten erwartet, die den selben Namen wie die Sounddatei haben muss, nur mit der Endung .time
z.B.
Liedname "tolles Lied.mp3"
dann muss die Zeit-Datei so heissen:
"tolles lied.time"

Der Inhalt sind einfach die Start- und Stopzeiten durch ein Komma getrennt.
z.B. die aus Deiner Aufgabenstellung:

Code: Alles auswählen

0,36
36,66
66,120
120,142
142,180
180,205
205,237
246,279
279,310
310,333
333,366
Benutzt wird das Script entweder mit den Cursortasten oder durch druecken der Zahlen zur Auswahl und danach ENTER.
z.B.
Einmaliges druecken der Taste 1 springt zum Ersten Eintrag.
Zweimaliges druechen zum Zehnten Eintrag usw...
Mit [TAB] oder Cursor Links/Rechts kannst Du unten die Ende-Taste auswaehlen.

P.S.
Es ist sehr schade, dass Du so grosse Probleme mit der Scripterei zu haben scheinst.
Ich mache selbst auch Musik mit debian und habe mir schon sehr viel Arbeit erspart mit der Scripterei.
Vlt. versuchst Du es ja noch mal, denn es lohnt sich wirklich und ist keine "Rakentenwissenschaft".
Moeglicherweise kennst Du ja auch jemand der es Dir mal Zeigen/Erklaeren kann und verstehst es so besser als durch "Selbststudium".
Viel Erfolg.

Gruss,
heinz

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bashscript: command per nutzereingabe auswählen

Beitrag von Meillo » 15.01.2021 13:19:14

Hier auch noch ein Ansatz von mir:

Code: Alles auswählen

#!/bin/sh

datei="ein schönes soundfile.ext"

list() {
	sed -n '/^[ 	]*[0-9][0-9]*)/p' "$0"
}

play() {
	vlc "$1" --start-time "$2" --stop-time "$3" --repeat
}

while :; do

	list
	printf "Auswahl: "
	read x

	case "$x" in

	1) play "$datei" 0 36 ;;
	2) play "$datei" 36 66 ;;
	3) play "$datei" 66 120 ;;
	4) play "$datei" 120 142 ;;
	5) play "$datei" 142 180 ;;
	6) play "$datei" 180 205 ;;
	7) play "$datei" 205 237 ;;
	8) play "$datei" 246 279 ;;
	9) play "$datei" 279 310 ;;
	10) play "$datei" 310 333 ;;
	11) play "$datei" 333 366 ;;
	q) exit

	esac

done
(Anmerkung: Im sed-Befehl in der list-Funktion stehen in den eckigen Klammern ein Leerzeichen und ein Tab.)

Ich habe versucht, moeglichst minimalistisch zu bleiben. Je nach konkretem Anwendungsszenario kann man das natuerlich noch verbessern.

Die verschiedenen Scriptentwuerfe und Denkweisen helfen dir, michaa7, vielleicht, ein Gefuehl dafuer zu bekommen, wie man an solche Probleme herangeht.
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von heisenberg » 15.01.2021 13:32:31

Statt vlc kann man auch mpv verwenden. Das hat den Vorteil, dass man den Abspielvorgang mit Tastatureingaben gut steuern kann.

q => quit und wieder ins Menü
Leertaste => Pause / Fortsetzen
Cursor rechts/links => 10 Sekunden vor/zurück
Cursor runter/hoch => 1 Minute vor/zurück

Beispielkommandos für mpv:

Code: Alles auswählen

start=120
ende=130
((dauer=$ende-$start))

mpv --start $start --length $dauer --loop 0  "$datei"
# --loop #anzahl wiederholt eine Anzahl von Malen. 0 heisst unendlich
Meillo hat geschrieben:

Code: Alles auswählen

list() {
    sed -n '/^[ 	]*[0-9][0-9]*)/p' $0
}
Das ist aber schon echt 'ne harte Nummer! Durchaus findig, aber nicht trivial und anfällig.

Erklärung: Der Befehl holt sich aus dem Quellcode des Scriptes selbst die Befehle für die Auswahlliste raus.
Zuletzt geändert von heisenberg am 15.01.2021 22:21:07, insgesamt 2-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bashscript: command per nutzereingabe auswählen

Beitrag von Meillo » 15.01.2021 13:52:51

heisenberg hat geschrieben: ↑ zum Beitrag ↑
15.01.2021 13:32:31
Meillo hat geschrieben:

Code: Alles auswählen

list() {
    sed -n '/^[ 	]*[0-9][0-9]*)/p' $0
}
Das ist aber schon echt 'ne harte Nummer! Durchaus findig, aber nicht trivial und anfällig.

Erklärung: Der Befehl holt sich aus dem Quellcode des Scriptes selbst die Befehle für die Auswahlliste raus.
Wenn du einen besseren Weg weisst, dann greife ich den gerne auf. Bislang habe ich den (im passenden Szenario = kleines Script, das letztlich nur aus einem grossen Switch besteht) fuer den besten Weg empfunden (kann man als Einzeiler hinter den Default-Case schreiben) ... Zumindest fuer die Scripte, die ich fuer mich selber geschrieben habe, fand ich den passend. (Hier habe ich letztlich nur ein Script von mir um eine Loop erweitert.)
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von heisenberg » 15.01.2021 14:24:44

Für ein Miniscript ist das gut - sehr elegant.

Ich lass' das ansonsten mal so stehen. Ich habe meinem Kommentar nichts weiter hinzuzufügen.

michaa7
Beiträge: 4929
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von michaa7 » 15.01.2021 19:17:48

OMG, mit allem hatte ich gerechnet, nur nicht damit.

Danke an alle, für ALLE Vorschläge!

WOW!

Ich werde mir alle Verschläge im Laufe der Zeit genauer anschauen, insbesondere den mit mpv (in der Hoffnung den mit moc, meinem absoluten lieblingsplayer, umsetzen zu können, was aber im Moment mehr Wunschdenken ist).
Ich habe mir jetzt erstmal die Version von Heinz angeschaut, weil es die erste Version war, weil sie für mich so gut beschrieben war, dass ich das Wesentliche schon beim ersten Lesen ohne zuviele Fragezeichen erahnen konnte, weil sich das nach bequemen Auswahlmenü anhörte.

Und nun funktioniert das .

SU-PER

(Einzige Stolpersteine: Der Quellcode auf paste-bin lies sich nicht in nano einfügen (Zwischenablage leer), mit mousepad ging es dann; Das Script gab beim ersten Lauf einen Fehler wg. des Dateinamens aus, es kam mit einem "." *im* Dateinamen nicht klar, weil es den wohl nur vor der Extension erwartet. Das script selbst liegt in ~/bin/ (ist im Pfad), ich starte es aus einem Terminal im Übungsverzeichnis meiner Musikdateien. Ich hätte schwören können, dass sich so ein Script dann nur mit vorangestelltem "./" starten ließe, ... es ließ sich im Gegenteil nur ohne diese Voranstellung starten ... hab ich wohl schon wieder was verwechselt ;-) )

Das Script tut was es soll, und das auf ziemlich bequeme und übersichtliche Weise (soweit es die Darstellung mit dialog betrifft; der Quellcode ist mir ein Rätsel ... mal sehn wie ich mir den mit der Zeit aneigne). Nochmals Danke!

Zu den anderen Beispielen kann ich hier jetzt noch nichts sagen, weil ich mit dem ersten Beispiel erstmal zufrieden bin und bei meinem Kenntnisstand weitere Experimente noch auf sich warten lassen.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: bashscript: command per nutzereingabe auswählen

Beitrag von heinz » 15.01.2021 20:22:18

michaa7 hat geschrieben: ↑ zum Beitrag ↑
15.01.2021 19:17:48
Das Script gab beim ersten Lauf einen Fehler wg. des Dateinamens aus, es kam mit einem "." *im* Dateinamen nicht klar, weil es den wohl nur vor der Extension erwartet.
Sorry, fehler meinerseits. (Nicht genug getestet...)
Ein Ersetzen aller

Code: Alles auswählen

${datei%%.*}
durch

Code: Alles auswählen

${datei%.*}
sollte das Problem beseitigen.
(In den Zeilen 52, 54 und 58)

Gruss,
heinz

michaa7
Beiträge: 4929
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von michaa7 » 15.01.2021 21:19:20

Danke. so klappt das auch mit weiteren Punkten im Dateinamen.

:-)
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bashscript: command per nutzereingabe auswählen

Beitrag von heisenberg » 15.01.2021 22:36:03

heisenberg hat geschrieben: ↑ zum Beitrag ↑
15.01.2021 13:32:31

Code: Alles auswählen

start=120
ende=130
((dauer=$ende-$start))

mpv --start $start --length $dauer --loop 0  "$datei"
# --loop #anzahl wiederholt eine Anzahl von Malen. 0 heisst unendlich
Das obige tut nicht was es soll. Nach der ersten Schleife fängt er nicht an der spezifizierten Stelle an sondern wieder von vorne. Damit er immer wieder an der gleichen Stelle anfängt, muss das so ausgeführt werden:

Code: Alles auswählen

start=10
dauer=5
datei="hallo.mp3"

# Spiele in endlosschleife("inf") die Datei $datei ab, ab Position $start für $dauer Sekunden.

mpv --loop-file=inf edl://$datei,$start,$dauer


Antworten