Bash og mulighed for at bryde ud af if...fi struktur

Dette forum bruges på EGET ANSVAR til at lege med scripts og andre ting med risiko for at beskadige sit eget og andres systemer.
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Bash og mulighed for at bryde ud af if...fi struktur

Indlæg af NickyThomassen »

Hvis man nu laver et script i sh, som fx skal sende en mail undervejs, så giver det for mig mening at samle de blokke som det kræver at forberede den mail. Det er selvfølgelig forudsat at hver af de blokke kan bryde ud af kontrol strukturen ved fejl.

Det kan nok bedst illustreres med et eksempel

Kode: Vælg alt

if [ (send mail-variablen er sat til send mail) ] ; then

(opret fil til at samle mail'en i)

   # Hvis filen ikke kunne oprettes, så er der ingen grund til at fortsætte
   if [ $? -nq 0 ] ; then
   break
   fi

(anden kode relateret til afsendelse af mail)

fi

Det er en teknik jeg har brugt en del, men den anden dag under en grundig test, opdager jeg til min rædsel at break ikke kan bruges i denne sammenhæng, og at det åbenbart slet ikke er muligt at bryde ud af en if...fi struktur i sh. For at tilpasse scriptet til det, så kommer det jo til at fylde mere, og bliver mere uoverskueligt

Kode: Vælg alt

if [ (send mail-variablen er sat til send mail) ] ; then

(opret fil til at samle mail'en i)

   # Hvis filen ikke kunne oprettes, så er der ingen grund til at fortsætte
   if [ $? -nq 0 ] ; then
   (sæt mail-variablen til ikke at sende mail)
   fi
fi

if [ (send mail-variablen er sat til send mail) ] ; then

(anden kode relateret til afsendelse af mail)

fi

Det kan godt være at det bare er mig, men det virker ikke ret smart. Er det virkelig ikke muligt at bryde ud af en if...fi i sh, og hvis ikke, er det så noget der gælder for "alle sprog" (C, C#, Python, Perl, PHP ...) ?
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: Bash og mulighed for at bryde ud af if...fi struktur

Indlæg af lath »

TitanusEramius skrev:Det kan godt være at det bare er mig, men det virker ikke ret smart. Er det virkelig ikke muligt at bryde ud af en if...fi i sh, og hvis ikke, er det så noget der gælder for "alle sprog" (C, C#, Python, Perl, PHP ...) ?

Det gælder ikke i C# og Python da de har det kaldes exceptions, hvor man har koden der kan fejle i en try blok. Fejl behanfles (mulgivis) i catch'es, 1 per exception type, hvis det giver mening der hvor man er, og dt gør det næsten aldrig, så man ryger ind finally blokken hvor man pænt op efter system ressources man ikke bruger.

Hvis du ikke fanger og behandler en exception i en catch blok så crasher programmet ,når den ikke håndterede exception når main, som er det sted hvor programmet starter.


I C er det helt anderledes, der findes der ikke exceeptions, og du skal selv skrive exceptionhandlingkode, ganske som i bash (shell).

Inde i et program gør man per konvention (i UNIX, Linux, og også mainframes) det at man returnerer 0 og opefter, hvis det gik godt, og fra -1 og nedefter hvis det ikke gik godt.
Funktionen der så kaldte en anden funktion har så en if lige efter funktionskaldet hvor man kigger efter tal mindre end 0 (som jo betyder at en fejl opstod), og så rydder den if så pænt opm og retunerer selv et negativt tal, så funktionen over den og kan fange det rydde pænt op og returnere et neggativt tal osv osv.

Ved systemkald er det lidt anderledes. Der defineres en ekstern variabel af typen int som hedder errno.
Den sætter man til 0 hver eneste gang lige før et systemkald af den årsag at variablen ikke ændres, hvis systemkaldet blev udført med success. Skete der derimod en fejl har errno et negativt tal, nogle gange tager et systemkald en parameter til en struct hvor den hælder fejlinformation ind i hvis det gik galt.
Efter systemkaldet undersøger man errno for tal < 0, og handler på det hvis der opstod en fejl. det gør man naturligvis i en if sætning.


Jeg vil anbefale dig at skifte til Python 3 nu hvor bash begynder at være meget begrænsende for hvad du gerne vil udvikle af software.
Python 3 er nemt at lære, og er et generelt objekt-orienteret programmeringssprog. Du kan blandt andet lavet GTK+ programmer med Python 3.
Hvis du vil lave GTK+ programmer så skal du kige på glade3, som er et program til at lave GTK+ grafiske brugergrænseflader. Filerne fra programmet indlæses så i dit program, og med en nogle få linier kode vises brugergrænsefladen på desktoppen.
http://glade.gnome.org/
http://python-gtk-3-tutorial.readthedocs.org/en/latest/install.html <-- Her bruges der GTK+ 3.x

Du kan også lave Qt programmer med Python 3.

Bemærk at der findes en 2.7.x der er den sidste fortolker af den gamle Python.
Python 2.x.x kode er inkompatibelt med Python 3.x.x kode.

Jeg anbefaler eric5 som grafisk udviklingsmiljø til Python 3 software udvikling
Billede
http://eric-ide.python-projects.org/eric-screenshots.html

eric5 er et meget lækkert python 3 udvikingsmiljø der gør dig mere produktiv.
Bemærk at eric4 er for Python 2.x.x.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: Bash og mulighed for at bryde ud af if...fi struktur

Indlæg af lath »

TitanusEramius skrev:Hvis man nu laver et script i sh, som fx skal sende en mail undervejs, så giver det for mig mening at samle de blokke som det kræver at forberede den mail. Det er selvfølgelig forudsat at hver af de blokke kan bryde ud af kontrol strukturen ved fejl.

Det kan nok bedst illustreres med et eksempel

Kode: Vælg alt

if [ (send mail-variablen er sat til send mail) ] ; then

(opret fil til at samle mail'en i)

   # Hvis filen ikke kunne oprettes, så er der ingen grund til at fortsætte
   if [ $? -nq 0 ] ; then
   break
   fi

(anden kode relateret til afsendelse af mail)

fi

Det er en teknik jeg har brugt en del, men den anden dag under en grundig test, opdager jeg til min rædsel at break ikke kan bruges i denne sammenhæng, og at det åbenbart slet ikke er muligt at bryde ud af en if...fi struktur i sh. For at tilpasse scriptet til det, så kommer det jo til at fylde mere, og bliver mere uoverskueligt

Kode: Vælg alt

if [ (send mail-variablen er sat til send mail) ] ; then

(opret fil til at samle mail'en i)

   # Hvis filen ikke kunne oprettes, så er der ingen grund til at fortsætte
   if [ $? -nq 0 ] ; then
   (sæt mail-variablen til ikke at sende mail)
   fi
fi

if [ (send mail-variablen er sat til send mail) ] ; then

(anden kode relateret til afsendelse af mail)

fi

Det kan godt være at det bare er mig, men det virker ikke ret smart. Er det virkelig ikke muligt at bryde ud af en if...fi i sh, og hvis ikke, er det så noget der gælder for "alle sprog" (C, C#, Python, Perl, PHP ...) ?


For nu at svare mere konkret så hopper man ikke ud fra en then delen af en if, og så ud til funktionens scope.
Det man går i stedet er at man helt forlader funktionen, så du kører en return i stedet for en break, og så skal du forfine dit design med flere funktioner.

/Lars

P.S. jeg mener stadig at det liv meget nemmere med et rigtigt programmeringssprog så som Python 3.
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Bash og mulighed for at bryde ud af if...fi struktur

Indlæg af NickyThomassen »

Nogen gange kan jeg godt mærke at den helt grundlæggende viden mangler, og det kommer så til udtryk i sådan nogle spørgsmål her. Jeg har ellers programmeret løst siden 90'erne, men dengang var det først på Commendoren, og siden i DOS. Fælles for DOS og SH er hvor meget de ligner hinanden, og jeg kan godt lide at SH er klar til at flytte filer, montere dreve osv.

Med risiko for at komme med en subjektiv bemærkning, så lider SH (og PHP) vel egentlig af en oversimplificering, der i sidste ende ødelægger sproget. Næsten som at fjerne alle ord på dansk med mere end 3 stavelser; det er bliver lettere at lære, men begrænset i brugen.

Jeg syntes at huske at jeg engang spurgte her på forummet, om hvilket general purpose sprog i ville anbefale som afløser til SH, og jeg syntes at huske at du også sagde Python da. Efter at have kigget på det (nogle timer om dagen, i nogle uger), opgav jeg det faktisk, og kiggede på Perl i stedet for. Og det er jeg faldet for.

Det er svært at formulere, men Python virker for struktureret efter min smag. At programmere må siges at udtrykke sig, og jo mere avanceret koncepter man udtrykker, jo vigtigere bliver sproget. I sidste ende kunne jeg forestille mig at valget af sprog afhænger af personlig præference og ikke af hvad der bedst (hverken til opgaven eller mere generelt).

Jeg er så småt gået i gang med "Programming Perl", og har fået det første CGI-script til at virke. Løsningen på spørgsmålet må blive som du forslår, flere funktioner i SH, og så at jeg begynder at bruge Perl stille og roligt.

Tak for uddybningen med exeptions, den gav en bedre forståelse af hvad der sker bag gardinet.
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: Bash og mulighed for at bryde ud af if...fi struktur

Indlæg af lath »

TitanusEramius skrev:Nogen gange kan jeg godt mærke at den helt grundlæggende viden mangler, og det kommer så til udtryk i sådan nogle spørgsmål her. Jeg har ellers programmeret løst siden 90'erne, men dengang var det først på Commendoren, og siden i DOS. Fælles for DOS og SH er hvor meget de ligner hinanden, og jeg kan godt lide at SH er klar til at flytte filer, montere dreve osv.

Med risiko for at komme med en subjektiv bemærkning, så lider SH (og PHP) vel egentlig af en oversimplificering, der i sidste ende ødelægger sproget. Næsten som at fjerne alle ord på dansk med mere end 3 stavelser; det er bliver lettere at lære, men begrænset i brugen.

Jeg syntes at huske at jeg engang spurgte her på forummet, om hvilket general purpose sprog i ville anbefale som afløser til SH, og jeg syntes at huske at du også sagde Python da. Efter at have kigget på det (nogle timer om dagen, i nogle uger), opgav jeg det faktisk, og kiggede på Perl i stedet for. Og det er jeg faldet for.

Det er svært at formulere, men Python virker for struktureret efter min smag. At programmere må siges at udtrykke sig, og jo mere avanceret koncepter man udtrykker, jo vigtigere bliver sproget. I sidste ende kunne jeg forestille mig at valget af sprog afhænger af personlig præference og ikke af hvad der bedst (hverken til opgaven eller mere generelt).

Jeg er så småt gået i gang med "Programming Perl", og har fået det første CGI-script til at virke. Løsningen på spørgsmålet må blive som du forslår, flere funktioner i SH, og så at jeg begynder at bruge Perl stille og roligt.

Tak for uddybningen med exeptions, den gav en bedre forståelse af hvad der sker bag gardinet.


Perl er ganske udmærket som avanceret scripting sprog - lige så godt som Python. Python er bare mere populært, men det gør ikke Perl dårligere på nogen som helst måde.
Den bedste fordel ved Perl er CPAN: http://www.cpan.org/ som er er et giganisk arkiv af perl moduler med pt 114792 perl moduler. Der er ikke den ting der ikke findes som et Perl modul.
Mange af perl modulerne er tilgængelig som en debian pakke i arkiverne, de ender typisk på navnet "-perl", hvis jeg husker rigtigt.
Jeg har selv haft snitterne i Perl og har 3 gode bøger om sproget, (en af de tidligste udgaver af Perl 5, så det er gamle bøger).

Vedrørende shell kommandoer kan du kalde bash shell kommandoer fra Perl med en tekst som argument, der bliver fortolket som et script den skal køre:
http://perldoc.perl.org/functions/system.html

Du starter med at angive /bin/bash som kommandoen, og så kigger du på manual siden for bash for at se hvad du skal skrive af argumenter for at få den til at fortolke en tekst du giver til kommandoen som et script

Kode: Vælg alt

man bash

q-tast afslutter manual pager.

Nu når du er gået i gang med Perl skal du vide at der er et grafisk udviklingsmiljø der hedder padre. Den installeres med:

Kode: Vælg alt

sudo apt-get install padre


/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags