getopt und case

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

getopt und case

Beitrag von scientific » 21.09.2017 11:45:58

Hi Leute!

Ich hab mir ein kleinen Skript geschrieben, worin ich eine Folge eines Podcasts runterladen und gleich in oga konvertieren möchte.
Das Skript soll möglichst einfach und komfortabel zugleich sein... :)

Code: Alles auswählen

#!/bin/bash

URL="http://traffic.libsyn.com/fitnessmitmark/"
help () {
cat <<EOF

USAGE: $0 [0-9][0-9][0-9]

Lädt eine Folge des Podcasts "Fitness mit Mark" von ''${URL}'' unter Angabe der Nummer der Folge (3-stellig mit führenden Nullen - z.B. 002) herunter.


EOF

}

set -- $(getopt -o h -- "$@")

while test $# -gt 0; do
    echo TEST: "$1"
    case $1 in
        -h)
            help
            exit 0
            ;;
        [0-9]*)
            echo wget ${URL/}fmm$(printf '%03g' $1).mp3
            shift
            ;;
        --)
            shift
            continue
            ;;
        *)
            help
            exit 1
            ;;
    esac
done
Kurz erklärt: ich parse die Optionen und Parameter mit getopt. Es gibt nur eine Option "-h". Wenn diese Option im Optionstring vorkommt, wird die Hilfe ausgegeben und das Skript beendet sich mit Exitstatus 0 (erfolgreich beendet).
Wenn nicht vorgesehene Optionen angegeben werden, wird die Hilfe ausgegeben und das Skript beendet sich mit Exitstatus 1 (nicht erfolgreich beendet)
getopt reiht alle Parameter die nicht in getopt definiert werden (und nicht mit "-" beginnen) hinter "--", daher auch in der Schleife die Abfrage nach --).

Wenn nun die restlichen Paramter nach -- Zahlen sind, soll der Download gemacht werden, indem die Zahl auf 3 Stellen vorne mit 0 aufgefüllt wird.

Das Problem dabei ist, dass nach getopt die Zahlen offenbar strings werden

Hier die Ausgabe mit dem Debug-String "Test", der jede einzlne Option ausgibt.

Code: Alles auswählen

$ ./download-podcast.sh 10 123
TEST: --
TEST: '10'

USAGE: ./download-podcast.sh [0-9][0-9][0-9]
10 ist keine Integerzahl mehr, sondern hat irgend ein anderes Datenformat (String???).
Aber eine Umwandlung in Integer mit dem Bashismus $(($1 + 0)) führt ebenfalls zu einer Fehlermeldung:

Im Skript die Debugzeile durch das ersetzt

Code: Alles auswählen

echo TEST: "$1 - $(($1 + 0))"
ergibt:

Code: Alles auswählen

 $ ./download-podcast.sh 10
TEST: -- - 0
./download-podcast.sh: Zeile 19: '10' + 0: Syntax Fehler: Operator erwartet. (Fehlerverursachendes Zeichen ist \"'10' + 0\").
Was könnte da los sein?

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
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: getopt und case

Beitrag von Meillo » 21.09.2017 12:00:32

scientific hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 11:45:58
Kurz erklärt: ich parse die Optionen und Parameter mit getopt. Es gibt nur eine Option "-h".
In dem Fall waere es sicher einfacher auf getopt(1) zu verzichten es so zu loesen:

Code: Alles auswählen

if [ "$1" = "-h" ]; then
    help
    exit
fi

for i do
    echo wget "$URL/fmm$(printf %03d "$i").mp3"
done
Ist vielleicht nicht so elaboriert, aber dafuer kurz, einfach und vermutlich funktionierender. ;-)

Hauptunterschiede:
- `%d' bei printf(1) statt `%g'
- `for i do' iteriert automatisch ueber "$@" (und ist portabel)
- Der Slash muss ausserhalb der Variablenklammer sein

scientific hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 11:45:58
Das Problem dabei ist, dass nach getopt die Zahlen offenbar strings werden
In der Shell gibt es eigentlich nur Strings. Bloss durch Extensions in Bash & Co. kann man Shellvariablen typisieren. An sich macht die Shell nichts als Stringhandling.

scientific hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 11:45:58
Was könnte da los sein?
Keine Ahnung wo die Singlequotes herkommen. Ich hatte das Problem noch nie. Vielleicht kommen sie von getopt(1), das ich nicht verwende.
Use ed once in a while!

owl102

Re: getopt und case

Beitrag von owl102 » 21.09.2017 13:20:50

Meillo hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 12:00:32
Keine Ahnung wo die Singlequotes herkommen. Ich hatte das Problem noch nie. Vielleicht kommen sie von getopt(1), das ich nicht verwende.
Japp:
man getopt hat geschrieben: ... Um dieses Problem zu lösen, kann diese Implementierung maskierte Ausgaben erzeugen, die erneut durch die Shell (normalerweise mittels des Befehls eval) interpretiert werden müssen. Damit werden diese Zeichen erhalten. ...
...
-u, --unquoted
maskiert die Ausgabe nicht. Beachten Sie, dass Leerraum und besondere (Shell-abhängige) Zeichen in diesem Modus zu Chaos führen können (wie sie dies auch in anderen Implementierungen von getopt(1) erzeugen).
Ich rate auch von der Verwendung von getopt ab, alleine schon, weil es eine "alte" und "neue" Implementierung gibt, die teilweise inkompatibel sind. Das kann man alles behandeln (es gibt auch extra in der neuen Implementierung einen Schalter zum Testen), es stellt sich für mich jedoch die Frage, ob sich das lohnt.

Wenn schon irgendwas in der Richtung, dann lieber getopts (mit einem "s" am Ende). Siehe auch: http://mywiki.wooledge.org/BashFAQ/035

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

Re: getopt und case

Beitrag von Meillo » 21.09.2017 14:50:30

@owl102: Interessante Infos -- danke!

owl102 hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 13:20:50
Ich rate auch von der Verwendung von getopt ab, alleine schon, weil es eine "alte" und "neue" Implementierung gibt, die teilweise inkompatibel sind. Das kann man alles behandeln (es gibt auch extra in der neuen Implementierung einen Schalter zum Testen), es stellt sich für mich jedoch die Frage, ob sich das lohnt.
Es ist schon ein Phaenomen: Egal welche Programmiersprache man nimmt, bei jeder gibt es mehrere zueinander inkompatible Getopt-Implementierungen, die alle irgendwelche Beschraenktheiten aufweisen. Am Ende macht man es besser von Hand ... traurig aber realitaetsnah.

owl102 hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 13:20:50
Wenn schon irgendwas in der Richtung, dann lieber getopts (mit einem "s" am Ende). Siehe auch: http://mywiki.wooledge.org/BashFAQ/035
Das ist auch die Variante, die in POSIX aufgenommen wurde. Dort findet man die interessanten Informationen im Rationale-Abschnitt: http://pubs.opengroup.org/onlinepubs/96 ... topts.html
Use ed once in a while!

geier22

Re: getopt und case

Beitrag von geier22 » 21.09.2017 15:47:14

Vielleicht hilft das ja weiter:
Ich habe es mal mit yutube-dl auf der Kommandozeile versucht - mit gutem Efolg.
Die URL's die die einzelnen Beiträge gibt es hier:
http://www.podcast.de/podcast/339737/archiv/

Befehl:

Code: Alles auswählen

$ youtube-dl http://www.podcast.de/episode/293897525/FMM%2B005%2B%253A%2BBrauchst%2BDu%2Bk%25C3%25BCnstliche%2BVitamine%253F%2BH%25C3%25B6rer-Sprechstunde%2Bmit%2Beinem%2BErn%25C3%25A4hrungsmediziner/ --output "%(title)s.%(ext)s"&& sleep 20  && ffmpeg -i *.mp3 -vn -acodec libvorbis -b:a 32k -ac 1 FMM_005:_Brauchst_Du_künstliche_Vitamine_32k_sleep_?.ogg && mv *.mp3 /home/hans/Downloads
Output: NoPaste-Eintrag39981
den sleep Befehl hab ich eingefügt, weil beim ersten Mal die ogg - datei irgenwie Fehlerhaft und nicht vollständig war. Ausserdem wurde in mein /home nur ein *.part verschoben t. ....hmmmmmm
Aber immerhin werden so aus 48,5 MB 12.5 MB --- Ohne Bildchen :cry:

Mediainfo:

Code: Alles auswählen

General
Complete name                            : /home/hans/Schreibtisch/FMM_005:_Brauchst_Du_künstliche_Vitamine_32k_sleep_?.ogg
Format                                   : Ogg
File size                                : 12.0 MiB
Duration                                 : 50 min 11 s
Overall bit rate mode                    : Variable
Overall bit rate                         : 33.3 kb/s
Album                                    : Fitness mit M.A.R.K. Podcast: Abnehmen | Muskelaufbau | Ernährung | Motivation
Album/Performer                          : Mark Maslow: Dranbleiben Fitness Coach, Personal Trainer und Blogger
Track name                               : FMM 005 : Q&A über Vitamine, Mineralien und Nahrungsergänzungsmittel mit dem Arzt Niels Schulz-Ruhtenberg
Track name/Position                      : 5
Performer                                : Mark Maslow: Dranbleiben Fitness Coach, Personal Trainer und Blogger
Genre                                    : Podcast
Description                              : Q&A mit Niels Schulz-Ruhtenberg, Sportarzt, Ernährungsmediziner und Ironman. Wir beantworten Deine Fragen zu den Themen: gesunde Ernährung, Vitamine, Mineralien, Nährstoffe, Nahrungsergänzungsmittel mit dem Ziel Abnehmen, Muskelaufbau, nackt gut aussehen.
Recorded date                            : 2014
Writing application                      : Lavc57.89.100 libvorbis
TSS                                      : Logic 10.0.7
iTunNORM                                 :  00000634 00000778 0001CBA4 00028F72 0022C8B1 0022E0AC 00008792 0000893F 002D94AC 002DAE7D
iTunSMPB                                 :  00000000 00000210 00000B11 0000000007EA24DF 00000000 02DF139A 00000000 00000000 00000000 00000000 00000000 00000000
TCM                                      : Mark Maslow: Dranbleiben Fitness Coach, Personal Trainer und Blogger
TT1                                      : Fitness mit M.A.R.K. Podcast: Abnehmen | Muskelaufbau | Ernährung | Motivation

Audio
ID                                       : 365816185 (0x15CDE979)
Format                                   : Vorbis
Format settings, Floor                   : 1
Duration                                 : 50 min 11 s
Bit rate mode                            : Variable
Bit rate                                 : 32.0 kb/s
Channel(s)                               : 1 channel
Sampling rate                            : 44.1 kHz
Compression mode                         : Lossy
Stream size                              : 11.5 MiB (96%)
Writing library                          : Lavf57.71.100
Jetzt müsste man doch "nur" ein Skript machen, das auf die Eingabe der URL wartet, und anschließend aus der Zeile

Code: Alles auswählen

 title           : FMM 005 : Q&A über Vitamine, Mineralien und Nahrungsergänzungsmittel mit dem Arzt Niels Schulz-Ruhtenberg
einen Teil oder alles als ogg- Dateiname übernehmen.

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

Re: getopt und case

Beitrag von scientific » 21.09.2017 16:32:51

Ah Spannend... podcast.de kannte ich gar nicht...

Ich hab jedenfalls mal alle mp3-Files ein wenig auseinandergenommen und festgestellt, dass bei einigen Files die Tracknummer, das Erscheinungsjahr und noch der eine oder andere Tag fehlt. Hab dem Autor mal diese Liste geschickt und ihn ermutigt, das noch zu ergänzen... vor allem die Tracknummer ist wichtig...

Den Unterschied zwischen getopt und getopts kannte ich nicht... muss ich gleich mal testen.

Konnte jetzt mit sed die Anführungszeichen rausschneiden, und jetzt funktioniert mein Skript auch so wie ich es will.

Ich verwende deswegen gerne getop(s), da ich es von den allermeisten Unix-Tools so gewohnt bin, dass man die Optionen und Parameter schön durcheinander angeben kann...
Das einzige was mir diesbezüglich regelmäßig in die Suppe spuckt ist das gute alte "find"... das parst die Kommandozeile nicht besonders flexibel... :evil:

Ja, diekt ein ogg runterladen, ist natürlich auch eine schöne Variante. Aber mit der Qualitätsstufe 1 von 10 ist das für diesen Podcast vollkommen ausreichend.

Was das Bildchen anbelangt... Eines im Verzeichnis, welches vom Player eingelesen wird ist doch fast besser, als das immer gleiche Bild in hunderten Files mitspeichern.
Portabler ist es mit Bild im File. Zugegeben. :)

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

owl102

Re: getopt und case

Beitrag von owl102 » 21.09.2017 16:35:15

scientific hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 16:32:51
Konnte jetzt mit sed die Anführungszeichen rausschneiden
Wenn du bei getopt den Parameter -u angibst, dann bekommst du die Anführungszeichen gar nicht erst.

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

Re: getopt und case

Beitrag von scientific » 21.09.2017 17:25:14

owl102 hat geschrieben:
scientific hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 16:32:51
Konnte jetzt mit sed die Anführungszeichen rausschneiden
Wenn du bei getopt den Parameter -u angibst, dann bekommst du die Anführungszeichen gar nicht erst.
In der Tat :-D

Vielen Dank
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
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: getopt und case

Beitrag von MartinV » 21.09.2017 18:45:10

Code: Alles auswählen

set -- $(getopt -o h -- "$@")
Ich verwende auch getopt und habe beim Parsen Ergebnisse mit 'single quotes'. Beispiel aus einem Script von mir:

Code: Alles auswählen

$ x11docker -v --gpu neon --kwin --output-count=2 plasmashell
Parsed options:  -v --gpu --kwin --output-count '2' -- 'neon' 'plasmashell'
Der Trick ist hier, mit eval zu arbeiten, in Deinem Fall

Code: Alles auswählen

eval set -- $(getopt -o h -- "$@")
eval ist fast immer ein riskantes no-go, in diesem Fall aber in Ordnung, weil kritische Stringteile, die falsch interpretiert werden könnten, immer in 'single quotes' stehen.

(Edit: Verwechslung getopt/getopts korrigiert)
Zuletzt geändert von MartinV am 21.09.2017 21:24:30, insgesamt 1-mal geändert.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: getopt und case

Beitrag von rendegast » 21.09.2017 19:30:53

Ich habe mich an das Beispiel
/usr/share/doc/util-linux/examples/getopt-parse.bash
gehalten und entsprechend

Code: Alles auswählen

...
(in der ersten Schleife kein Bezug auf die Zahlenargumente)
		'--')
			shift
			break
		;;
		*)
			echo 'Internal error!' >&2
			exit 1
		;;
	esac
done

echo 'Remaining arguments:'
for arg; do
	echo "--> '$arg'"
case $arg in
    [0-9]*)
	echo Zahl: $arg
	;;
    *)
	echo ECHO $arg
	;;
    esac
done
Anmerkung: "arg" taucht in dem Skript erst in dem 'for arg; do' auf,
die Variable kann beliebig anders heißen.

Beachte das 'shift;break;' beim --), statt Deinem 'shift;continue;'.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

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

Re: getopt und case

Beitrag von scientific » 21.09.2017 20:36:38

Für ein wirklich eher selten zu verwendendes Skript für einen einfachen Download natürlich ein wenig überkandidelt... :)

Aber als Programmierfingerübung ganz gut geeignet. Hab schon länger keine Bash-Skripte mehr geschrieben.
Hier mein endgültiger Code.

Code: Alles auswählen

#!/bin/bash

URL="http://traffic.libsyn.com/fitnessmitmark/"
help () {
cat <<EOF

USAGE: 
    $0 [-D] [-d] <[0-9][[0-9][[0-9]]]> [[0-9][[0-9][[0-9]]]]...
    $0 [-h]


    -h      Zeigt diese Hilfe
    -D      Download alleine
    -d      dry run - zeigt was getan würde

    als Argumente werden 1-3-stellige Ziffern und Zahlen erwartet, welche die Folge des Podcasts bezeichnet. Die Argumente können mit oder ohne führende Nullen angegeben werden.

Lädt eine Folge des Podcasts "Fitness mit Mark" von ''${URL}'' unter Angabe der Nummer der Folge (3-stellig mit führenden Nullen - z.B. 002) herunter.

EOF
[ -n "$1" ] && echo Fehlerhafte Option: "$1"
shift
[ -n "$1" ] && echo Restliche Optionen: "$@"


}

set -- $(getopt -u -o dDh -n 'getopt parsing' -- "$@")

[ -d ogg ] || mkdir ogg

DRY=false
DOWNLOAD_ONLY=false

while test $# -gt 0; do
    case $1 in
        -h)
            help
            exit 0
            ;;
        -d) 
            DRY=true
            shift
            echo "--------- dry-run ---------"
            ;;
        -D) 
            DOWNLOAD_ONLY=true
            echo "------ download-only ------"
            shift
            ;;
        [0-9]*)
            FILE_MP3="fmm$(printf '%03g' ${1}).mp3"
            FILE_OGA="fmm$(printf '%03g' ${1}).oga"
            if $DRY; then
                echo wget "${URL}${FILE_MP3}"
                if ! $DOWNLOAD_ONLY; then
                    echo "Download only, no converting"
                else
                    echo ffmpeg -i "${FILE_MP3}" -c:a libvorbis -qscale:a 1 "ogg/${FILE_OGA}" #|batch
                fi
            else
                [ -n "${FILE_MP3}" -a -e "${FILE_MP3}" ] && rm -f "${FILE_MP3}"
                wget "${URL}${FILE_MP3}"
                if ! $DOWNLOAD_ONLY; then
                    echo "Download only, no converting"
                else
                    echo ffmpeg -i "${FILE_MP3}" -c:a libvorbis -qscale:a 1 "ogg/${FILE_OGA}" |batch
                fi
            fi
            shift
            ;;
        --)
            shift
            continue
            ;;
        *)

            help "$@"
            exit 1
            ;;
    esac
done

exit 0
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

owl102

Re: getopt und case

Beitrag von owl102 » 21.09.2017 21:01:14

MartinV hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 18:45:10
Auch getopts gibt beim Parsen Ergebnisse mit 'single quotes'.
Das kann ich nicht bestätigen. Wenn ich z.B. das Script aus http://mywiki.wooledge.org/BashFAQ/035 ausprobiere, erhalte ich keine Quotes. Ebensowenig bei meinen eigenen Scripts.
Beispiel aus einem Script von mir:
Hast du ein Script für mich, welches getopts verwendet und Quotes generiert?

Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: getopt und case

Beitrag von MartinV » 21.09.2017 21:21:18

owl102 hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 21:01:14
MartinV hat geschrieben: ↑ zum Beitrag ↑
21.09.2017 18:45:10
Auch getopts gibt beim Parsen Ergebnisse mit 'single quotes'.

Das kann ich nicht bestätigen.
Ups. :oops:
Tatsächlich verwendet mein Skript auch getopt ohne s, ich hatte es falsch in Erinnerung und dachte, ich verwende getopts. :roll:
(Ich korrigiere das mal)
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

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

Re: getopt und case

Beitrag von Meillo » 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?
Use ed once in a while!

geier22

Re: getopt und case

Beitrag von geier22 » 22.09.2017 03:22:41

Hab noch eine Lösung, die komplett durchläuft und die gewünschte ogg- Datei mit der Podcast- Nummer liefert.
Ist noch verbesserungswürdig und sicher nicht elegant, aber funktioniert. Die Verzeichnisse müssen vorher angelegt sein.
Für Verbesserungen bin ich dankbar :hail:

Code: Alles auswählen

#!/bin/bash

firefox http://www.podcast.de/podcast/339737/archiv/| 

echo "-- Wenn sich das Browser Fenster geöffnet hat, bitte ein Podcast auswählen	
-- die gewünschte URL kopieren	
-- die URL des gewünschten Downloads hier einfügen und anschließend die Eingabetaste drücken
-- Nach dem Schließen des Browser-Fensters startet der Download."

read p

cd /home/hans/Downloads/Youtube_Downloads/ogg

youtube-dl  $p --output "%(title)s.%(ext)s" 

sleep 5

x=$(id3info *.mp3 |grep Tag |cut -c 25-31)

echo "$x" && ffmpeg -i *.mp3 -vn -acodec libvorbis -b:a 32k -ac 1  "$x".ogg && mv *.mp3 /home/hans/Downloads/Youtube_Downloads/mp3

exit 
Ergebnis:

Code: Alles auswählen

$ ogginfo \ FMM\ 007\ .ogg
Processing file " FMM 007 .ogg"...

New logical stream (#1, serial: d45bb5b8): type vorbis
Vorbis headers parsed for stream 1, information follows...
Version: 0
Vendor: Lavf57.71.100
Channels: 1
Rate: 44100

Nominal bitrate: 32,000000 kb/s
Upper bitrate: 4294967,295000 kb/s
Lower bitrate: 4294967,295000 kb/s
User comments section follows...
	encoder=Lavc57.89.100 libvorbis
	TSS=Logic 10.0.7
	iTunNORM= 000006F5 000006F2 00021CE6 00021D73 0035C034 0035C034 00008C12 00008C12 00309263 00309263
	iTunSMPB= 00000000 00000210 0000091A 00000000097F1956 00000000 0371FF08 00000000 00000000 00000000 00000000 00000000 00000000
	genre=Podcast
	title=FMM 007 : MensHealth Chef Markus Stenglein über Sixpack, Schweinehund und Sport aus Leidenschaft
	artist=Mark Maslow: Dranbleiben Fitness Coach, Personal Trainer und Blogger
	ALBUMARTIST=Mark Maslow: Dranbleiben Fitness Coach, Personal Trainer und Blogger
	TCM=Mark Maslow: Dranbleiben Fitness Coach, Personal Trainer und Blogger
	album=Fitness mit M.A.R.K. Podcast: Abnehmen | Muskelaufbau | Ernährung | Motivation
	TT1=Fitness mit M.A.R.K. Podcast: Abnehmen | Muskelaufbau | Ernährung | Motivation
	TRACKNUMBER=7
	DESCRIPTION=Markus Stenglein ist MensHealth Chef und gehört zum Redaktions-Urgestein des meistgelesenen Männermagazins im deutschen Raum. Dass er nicht nur fit aussieht, sondern auch für Fitness brennt, spürst Du, wenn Du Dich mit ihm unterhältst.
	date=2014
Vorbis stream 1:
	Total data length: 14450525 bytes
	Playback length: 60m:12.865s
	Average bitrate: 31,997927 kb/s
Logical stream 1 ended

scientific
Beiträge: 3020
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: 3020
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

geier22

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.

scientific
Beiträge: 3020
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: 5578
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: 8782
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 once in a while!

owl102

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.)

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
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 once in a while!

Antworten