getopt und case

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
scientific
Beiträge: 2960
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: getopt und case

Beitrag von scientific » 22.09.2017 10:26:21

Statt

Code: Alles auswählen

firefox
würd ich

Code: Alles auswählen

sensible-browser
verwenden. Denn das öffnet ein Fenster/Tab im bereits geöffneten Browser, ansonsten im voreingestellten System-Browser... Abhängig vom Interface... Im TTY wird damit z.B. ein Textbrowser geöffnet...

Ist eine Debian-Besonderheit, soweit ich weiß.

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

scientific
Beiträge: 2960
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: getopt und case

Beitrag von scientific » 22.09.2017 10:46:27

Meillo hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 23:37:03
scientific hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 20:36:38
Hier mein endgültiger Code.
[...]
Willst du nicht doch:

Code: Alles auswählen

for i do
(mit $i), statt:

Code: Alles auswählen

while test $# -gt 0; do
(mit $1 und shift) verwenden?
Ich hab früher einmal relativ umfangreiche Shellskripte geschrieben, und da hab ich diese Methode als am wenigsten Fehleranfällig wahrgenommen.
Die While-Schleife wird nur so lange ausgeführt, als die Anzahl der Argumente in $@ größer als 1 ist. Funktioniert doch gut :)

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
geier22
Beiträge: 3189
Registriert: 23.02.2014 09:43:01
Wohnort: Berlin

Re: getopt und case

Beitrag von geier22 » 22.09.2017 11:08:46

@scientific
Danke für den
sensible-browser
:THX:
hatte ich zwar schon gesehen, wusste aber die Bedeutung nicht.
Jetzt bleibt das Skript auch nicht mehr hängen und wartet auf das Schließen des Browsers.
4.13.0-1-amd64 #1 SMP Debian 4.13.4-2 (2017-10-15) (Buster)/ XFCE 4.12.3 / Asrock Fatal1ty 970 Performance 3.1 / AMD FX-6300 / 16GB RAM / Nvidia GTX 750 TI (Treiber 375.82-8) / HP LP3065

scientific
Beiträge: 2960
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: getopt und case

Beitrag von scientific » 22.09.2017 12:41:18

DAS hätte wohl auch ein & am Ende des Firefoxaufrufes erledigt.

Aber der sensible-browser ist besser.

Probiers mal auf dem TTY aus!
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
Lord_Carlos
Beiträge: 4060
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: getopt und case

Beitrag von Lord_Carlos » 22.09.2017 13:38:31

Ich wuerde das ganze anders loesen.
Youtube-dl mit archive parameter als cron job laufen lassen. Dann werden neue Episoden automatisch runtergeladen und konvertiert. Ganz ohne Benutztereingabe oder UI, geht also auch auf 'nem ollen server.

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

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

Re: getopt und case

Beitrag von Meillo » 22.09.2017 21:10:39

scientific hat geschrieben: ↑ zum Beitrag ↑
22.09.2017 10:46:27
Meillo hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 23:37:03
scientific hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 20:36:38
Hier mein endgültiger Code.
[...]
Willst du nicht doch:

Code: Alles auswählen

for i do
(mit $i), statt:

Code: Alles auswählen

while test $# -gt 0; do
(mit $1 und shift) verwenden?
Ich hab früher einmal relativ umfangreiche Shellskripte geschrieben, und da hab ich diese Methode als am wenigsten Fehleranfällig wahrgenommen.
Die While-Schleife wird nur so lange ausgeführt, als die Anzahl der Argumente in $@ größer als 1 ist. Funktioniert doch gut :)
``Funktioniert doch gut'' und ``am wenigsten fehleranfaellig'' sind zwei verschiedene Dinge. Vieles daran mag eine Stilfrage und persoenliche Praeferenz und Gewohnheit sein, aber es gibt auch eine sachliche Ebene:

`for i do' garantiert, dass die Schleife fuer jedes Argument genau einmal durchlaeuft. Das ist sehr robust. Bei deiner Schleifenbedigung koennen off-by-one Fehler passieren, falls man aus Versehen ``-ge 0'' oder ``-gt 1'' schreibst. Dies ist im anderen Fall ausgeschlossen. Zudem muss man bei deiner Variante als Programmierer dran denken, dass jeder Fall ein ``shift'' enthaelt. Dies ist bei ``for i do'' unnoetig. Zudem reduziert mein Vorschlag den Codeumfang, was statistisch wiederum Fehler reduziert. Folglich faellt aus meiner Sicht die sachliche Analyse zur Fehleranfaelligkeit klar anders rum aus. Aber du hast ja auch nur geschrieben, dass du die Fehleranfaelligkeit so wahrgenommen hast; ich habe hier sachlich argumentiert.

Du kannst das von mir aus auch weiter so machen wie du willst -- sind ja deine Scripte -- ich denke nur, dass es hier sachliche Gruende gibt, es anders zu tun, und die ueberzeugen dich vielleicht. ;-)
Use ed(1) once in a while!

owl102
Beiträge: 2296
Registriert: 16.10.2010 13:05:57
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Timbuktu

Re: getopt und case

Beitrag von owl102 » 22.09.2017 21:34:54

Meillo hat geschrieben: ↑ zum Beitrag ↑
22.09.2017 21:10:39
ich denke nur, dass es hier sachliche Gruende gibt, es anders zu tun, und die ueberzeugen dich vielleicht. ;-)
Es gibt aber IMHO auch sachliche Gründe, die hier gegen "for" sprechen: Der Ansatz von scientific ist flexibler, was die Auswertung der Kommandozeilenparameter angeht. Wenn z.B. eine Option einen zusätzlichen Parameter hat (zum Beispiel "-f <dateiname>"), kommt die einfache Lösung mit "for i" nicht in Frage, zumindest dann nicht, wenn man nicht auch noch eine State-Variable einführen möchte. Sicher, in diesem Beispiel ist das nicht der Fall, aber wer hat schon Lust, alles umzuschreiben, falls bei dem Script doch einmal eine Option mit Parameter dazu kommt? (Hinzu kommt, daß das Umschreiben auch fehleranfällig ist.)
Fedora 28 Workstation -- openSUSE Leap 42 / Gnome -- Debian 9 (Qnap TS-109/119) -- OmniOS (HP N54L)

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

Re: getopt und case

Beitrag von Meillo » 23.09.2017 09:09:18

owl102 hat geschrieben: ↑ zum Beitrag ↑
22.09.2017 21:34:54
Meillo hat geschrieben: ↑ zum Beitrag ↑
22.09.2017 21:10:39
ich denke nur, dass es hier sachliche Gruende gibt, es anders zu tun, und die ueberzeugen dich vielleicht. ;-)
Es gibt aber IMHO auch sachliche Gründe, die hier gegen "for" sprechen: Der Ansatz von scientific ist flexibler, was die Auswertung der Kommandozeilenparameter angeht. Wenn z.B. eine Option einen zusätzlichen Parameter hat (zum Beispiel "-f <dateiname>"), kommt die einfache Lösung mit "for i" nicht in Frage, zumindest dann nicht, wenn man nicht auch noch eine State-Variable einführen möchte.
Da hast du Recht.
Sicher, in diesem Beispiel ist das nicht der Fall, aber wer hat schon Lust, alles umzuschreiben, falls bei dem Script doch einmal eine Option mit Parameter dazu kommt? (Hinzu kommt, daß das Umschreiben auch fehleranfällig ist.)
Das ist immer ein Abwaegen im Spektrum zwischen der einfachsten und der flexibelsten Umsetzung. Welches die bessere Anfangsform war weiss man erst hinterher.

(Ja, Umschreiben ist fehleranfaellig, trotzdem sollte man Umschreiben als den normalsten Vorgang der Programmierung ansehen, und nicht etwa das Neuschreiben.)
Use ed(1) once in a while!

Antworten