/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
DR Netradio
Fra : Bendt Vinge Rasmusse~


Dato : 06-02-06 19:40

Her er et lille script til DR-netradio.
Kræver mplayer.

Kommentarer/forbedringer er velkomne - hvordan kunne man fx. lave det mindre
"hardcoded".


 
 
Jes Vestervang (06-02-2006)
Kommentar
Fra : Jes Vestervang


Dato : 06-02-06 20:37

Bendt Vinge Rasmussen <bendt.v.rasmussen@skolekom.dk> writes:

> Her er et lille script til DR-netradio. Kræver mplayer.

Det her er heller ikke ringe: <http://www.cs.aau.dk/~mejlholm/drradio>
--
mvh Jes Vestervang @ Debian Sid

Bendt Vinge Rasmusse~ (06-02-2006)
Kommentar
Fra : Bendt Vinge Rasmusse~


Dato : 06-02-06 21:50

Version 2.0


Claus Rasmussen (06-02-2006)
Kommentar
Fra : Claus Rasmussen


Dato : 06-02-06 22:48

Bendt Vinge Rasmussen wrote:

Sødt script.

> Kommentarer/forbedringer er velkomne - hvordan kunne man fx. lave det
> mindre "hardcoded".

Du bør validere input. F.eks kan du tilføje en catch-all på din case, der
skriver en fejlmeddelelse:

case "$valg" in
1) ...
2) ...
*) echo "Illegal input: '$valg'" >&2
exit 1
;;
esac

'*)' matcher alt, så den skal stå tilsidst.

Det er i øvrigt god praksis altid at have en sådan catch-all når du anvender
en case sætning. Uanset programmeringssprog.

-Claus


Bendt Vinge Rasmusse~ (07-02-2006)
Kommentar
Fra : Bendt Vinge Rasmusse~


Dato : 07-02-06 14:56

Claus Rasmussen wrote:

>
> case "$valg" in
> 1) ...
> 2) ...
> *) echo "Illegal input: '$valg'" >&2
> exit 1
> ;;
> esac
>

Det har jeg nu føjet til, men uden "exit 1".
Hvis den står der, hopper den helt ud af mit while loop og lukker
programmet. Kan jeg ikke på en smart måde hoppe tilbage til starten af mit
loop - lige nu lader jeg jo bare mplayer returnere en fejlmeddelelse og
kører så videre derudaf.

Bendt


Claus Rasmussen (07-02-2006)
Kommentar
Fra : Claus Rasmussen


Dato : 07-02-06 23:05

Bendt Vinge Rasmussen wrote:

> ... Kan jeg ikke på en smart måde hoppe tilbage til starten af mit
> loop - lige nu lader jeg jo bare mplayer returnere en fejlmeddelelse og
> kører så videre derudaf.

Jo. Så skal du bruge en funktion:

function skaf_valg() {
case "$valg" in
1) ...
2) ...
*) return 1
esac
}

until [ "$valg" = q ]
do ...
skaf_valg
if [ $? = 0 ]
then echo "Spliller nu $station..."
mplayer ...
fi
done


"return 1" gør at funktionen returnerer med exit status 1 (det normale er
0). Exit status kan aflæses i $? og if-sætningen sikrer at mplayer kun
bliver kørt, hvis brugeren har indtastet et korrekt input.

-Claus



Bendt Vinge Rasmusse~ (08-02-2006)
Kommentar
Fra : Bendt Vinge Rasmusse~


Dato : 08-02-06 21:05

Version 2.1

Nu har jeg implementeret dine forslag.
Men hvordan får jeg nu stationerne ud i en ekstern fil?

Jeg ville også gerne kunne rulle igennem en menu, men det er vel for
krævende til at kunne forklare her?

Bendt


Bendt Vinge Rasmusse~ (09-02-2006)
Kommentar
Fra : Bendt Vinge Rasmusse~


Dato : 09-02-06 10:09

Her er den så: den længe ventede v. 3.0 - nu med menu!



Claus Rasmussen (10-02-2006)
Kommentar
Fra : Claus Rasmussen


Dato : 10-02-06 06:54

Bendt Vinge Rasmussen wrote:

> Her er den så: den længe ventede v. 3.0 - nu med menu!

Nåda, der lærte jeg noget nyt: Jeg havde aldrig set 'dialog' kommandoen
før

Jeg har nogle kommentarer:

o Du anvender en temporær fil men sletter den ikke igen. Desuden har du
hardcodet navnet på den. Det gør ikke så meget, da programmet i forvejen er
et enkeltbrugerprogram, men for en anden gangs skyld er standard ideomet
for temporære filer:

PROGRAM=$(basename $0)
TMPFILE=$(mktemp /tmp/$PROGRAM.XXXXXX)
trap "rm -f $TMPFILE" EXIT

Den første linie finder navnet på programmet uden sti. Den anden linie
genererer et filnavn, der er garanteret til at være forskelligt fra alle
andre filnavne i /tmp ('XXXXXX' bliver erstattet med en unik streng). Den
tredje linie sørger for at filen automatisk bliver slettet, når programmet
terminerer.

o mplayer "støjer". Den skriver en masse info ud på skærmen, som ikke er så
pænt at kigge på. Du kan få det væk ved at tilføjet et '&>/dev/null' til
mplayer kommandoen. Så vil alt output fra kommandoen blive sendt ned i et
sort hul.

o Du bør også tilføje et 'clear' før du skriver hvilken station, der spiller
nu, så bunden af menuen ikke bliver hængene på skærmen.

o Du efterlyste en måde at gøre programmet mindre hardcodet på. Jeg ved ikke
om det er så god en ide. Det fine ved dit script er, at det er meget
simpelt, så det umiddelbart kan forstås. Sammenlign f.eks med python
scriptet, der også blev postet i denne tråd. Så snart du begynder at
tilføje datafiler, bliver du nødt til at tage stilling til en hel række
andre problemer, som lynhurtigt vil gøre kål på det simple i dit program:

- Hvor skal datafilen placeres ? Der findes en række _forskellige_
standarder, som du skal vælge mellem. Det naive svar vil være "i det samme
katalog som programmet selv", men det er ikke trivielt at finde ud af, hvor
et program bliver kørt fra. Specielt hvis symlinks er involveret. Ydermere
er der en del mennesker som har en ret facistisk holdning til
systemadministration (undertegnede indbefattet og som under ingen
omstændigheder vil have datafiler liggende i ../bin kataloger.

- Så kan du lægge datafilen i et forudbestemt katalog - f.eks $HOME/etc, men
hvad nu hvis jeg har en anden ide om, hvor datafilen skal ligge ? Så skal
du have en parameter til at angive datafilens placering. Og den parameter
skal parses og valideres osv.

- Og hvad nu hvis datafilen ikke kan findes ? Du bliver så nødt til at
skrive kode som først tjekker om filen findes.

- Og hvad hvis formatet af datafilen er forkert ? Du skal altså også skrive
kode til at tjekke syntaxen af datafilen.

Osv. osv. Og lynhurtigt er dit program blevet længere og mere uforståeligt
end det python script jeg omtalte.

Men _hvis_ du insisterer er her en skitse af, hvordan du kan gøre det:

I toppen af scriptet definerer du datafilens placering:

DATAFIL=$HOME/etc/radioafspiller.dat

Før du går ind i loopet checker du at filen eksisterer:

if [ ! -f $DATAFIL ]
then # Udskriv fejlmeddelelse og afslut
fi

I 'dialog' kommandoen beder du den læse sine menu options fra en fil:

dialog --backtitle "..." --title "..." --menu 15 40 10 --file $DATAFIL

Din datafil rummer een linie pr valg, som her:

DR_P1 "DR P1"
DR_P2 "DR P2"
DR_P3 "DR P3"

Men jeg synes altså du bare skulle lade tingene være hardcodet.

-Claus




Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste