Videregående shellprogrammering i Linux

Like dokumenter
Videregående shellprogrammering

Lynkurs i shellprogrammering under Linux

Shellprogrammer og -variabler

Betinget eksekvering og logiske tester i shell

Oversikt. Beskrivelse Bash. 1 UNIX shell. 2 Kommandolinje som brukergrensesnitt. 3 Input og output. 4 Bash builtins. 5 Linux utilities.

Høgskoleni Østfold. Ny/utsatt EKSAMEN

Nyttige Linux-kommandoer. Hvordan du kan jobbe mer effektivt Dag Langmyhr

Operativsystemer og nettverk

EKSAMEN. Dato: 7. desember 2016 Eksamenstid: 09:00 13:00

Håndtering av filer og kataloger

Linux-programmer som bruker regulæruttrykk: grep, sed, awk

Shellscripting I. Innhold

Håndtering av filer og kataloger

Filterprogrammer og redirigering av I/O

Filterprogrammer og redirigering av I/O

Oppgave 1 - Linux kommandolinje (%)

Generelt om shell / skall

EKSAMEN. Operativsystemer og nettverk

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring

Prøve- EKSAMEN. Operativsystemer med Linux

Ny EKSAMEN. Operativsystemer og nettverk

Operativsystemer og nettverk Løsningsforslag til eksamen Oppgave 1. a) Linux-kommando: java Beregn & b) Shellprogram:

Løsningsforslag til eksamen 24. november 2015

1,r H øgs kolen i Østfol d

Oppgave 1 - Java og prosesser (20%)

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

EKSAMEN. Dato: 24. november 2015 Eksamenstid: 09:00 13:00

EKSAMEN. Operativsystemer. 1. Læreboken "A Practical Guide to Red Hat Linux" av Mark Sobell 2. Maks. tre A-4 ark med selvskrevne notater.

Prosesstabeller (PCB - Prosess Control Block) Se på PD: kommandoene ps og top Bakgrunnsprosesser Opprettelse av prosesser:

Øvingsforelesning 3 Python (TDT4110)

Øvingsforelesning 5 Python (TDT4110)

Prosedyrer. Lars Vidar Magnusson. October 26, Lars Vidar Magnusson () Forelesning i DAS October 26, / 19

Programmering i C++ Løsningsforslag Eksamen høsten 2005

UNIX/Linux brukerveiledning

Øvingsforelesning 5 Python (TDT4110)

EKSAMEN. Operativsystemer. Kontroller at oppgaven er komplett før du begynner å besvare spørsmålene.

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Dagens program. Operativsystemer Prosesser og systemkall i UNIX Hente prosessens nummer Starte prosesser Vente på prosesser Utføre programmer

Dagens tema. Perl: Mer om regulære uttrykk Filer Lister og tabeller Kompilering og interpretering (kapittel ) IN 211 Programmeringsspråk

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Dagens tema: 12 gode råd for en kompilatorskriver

Metoder med parametre, løkker og arrayer

Finne ut om en løsning er helt riktig og korrigere ved behov

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

LISP PVV-kurs 25. oktober 2012

Oppgaver til forkurs i informatikk dag 2

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Mattespill Nybegynner Python PDF

Løkker og arrayer. Løse problemer med programmering. INF1000, uke3 Geir Kjetil Sandve

Programmering Høst 2017

$ls -l $grep -i Olsen adresseliste.txt less #!/bin/sh $echo `ls` $chmod 755. Praktisk Linux. Grunnleggende skall kommandoer. Irene Ludvigsen Husa

Del 1 En oversikt over C-programmering

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Repetisjon Novice Videregående Python PDF

}?> <!DOCTYPE... <html xmlns=" <head>... </head> <body> <p>nå skal vi printe hallo:</p> <?php //funksjonskall

Linux distribusjoner

Kapittel 1 En oversikt over C-språket

TDT Øvingsforelesning 1. Tuesday, August 28, 12

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

EKSAMEN. Dato: 8. desember 2017 Eksamenstid: 09:00 13:00

MAT1030 Diskret Matematikk

ITGK - H2010, Matlab. Repetisjon

Råd nr 1: Start nå! Det tar typisk timer å programmere Del 1 om man ikke har gjort slikt før. Dagens tema:

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå.

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

Eksamensinformasjon. Linux kommandolinje. Linux kommandolinje. Eksamensinformasjon. Fakultet: Teknologi, kunst og design. Tid: 3 t.

Løse reelle problemer

MAT1030 Plenumsregning 1

EKSAMEN. Om eksamensoppgavene. Vekting av oppgavene. Emnekode og -navn: ITF22515 Operativsystemer med Linux. Dato go tid: 7.12.

Brukerveiledning for ArkN4

Python: Strenger 3. utgave: Kapittel 8

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

TDT4165 PROGRAMMING LANGUAGES. Exercise 01 Introduksjon til Oz

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

Programmeringsspråket C Del 3

EKSAMEN. Operativsystemer. Dato: 10. desember 2008 Eksamenstid: kl til kl

Bygg et Hus. Steg 1: Prøv selv først. Sjekkliste. Introduksjon. Prøv selv

TDT4110 Informasjonsteknologi grunnkurs: Tema: Mer om strenger. - 3rd edition: Kapittel 8. Professor Alf Inge Wang

Programmeringsspråket C Del 3

TDT4105 Informasjonsteknologi grunnkurs Øvingsforelesning 2. Iver Dihle Skjervum Vit.ass. ITGK

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

if-tester Funksjoner, løkker og iftester Løkker og Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

Filer i Linux og Bourne-again shell

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

INF Obligatorisk innlevering 5

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

Haskell. Kjetil Ørbekk. Programvareverkstedet, 19. mars 2009

Finne ut om en løsning er helt riktig og korrigere ved behov

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

1. obligatoriske innlevering, høsten 2014

Løse reelle problemer

Filer i Linux og Bourne-again shell

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Forelesning inf Java 5

Eksamensinformasjon. Prosesser. Prosesser. Eksamensoppgave. Operativsystemer (DATS/ITPE2500) Bokmål 06. juni 2017 kl

Utførelse av programmer, metoder og synlighet av variabler i JSP

Hendelser Apprentice ComputerCraft PDF

Transkript:

Videregående shellprogrammering i Linux

Innhold Variabeldeklarasjoner Manipulering av tekststrenger / variable Tomme (null)strenger og defaultverdier Tabeller / arrays i shellprogrammer Shellfunksjoner og subshell Flere iterative mekanismer Flere mekanismer for seleksjon og gruppering Tidsbestemt kjøring av shellprogrammer Debugging og testing

Deklarasjon av variable Vanlige variable lagrer tegnstrenger Opprettes av shellet første gang de refereres til: navn=jan unset kan brukes til å fjerne innholdet i en variabel declare kan opprette variable med bestemte egenskaper: declare i tall declare r Pi=3.14 declare l navn declare u navn declare x navn heltallsvariabel read-only(!) variabel alltid lower-case alltid upper-case eksporteres til subshell

Innebygde operasjoner på tegnstrenger ${#Navn} Antall tegn ${Navn:3} Substreng fra 4. tegn ${Navn:2:3} Substreng fra 3. til 5. tegn ${Navn/en/an} Bytt første forekomst av en med an ${Navn//en/an} Bytt alle forekomster av en med an ${Navn//en/} Fjern alle forekomster av en ${Navn/#en/an} Bytt bare hvis en er i starten på streng ${Navn/%en/an} Bytt bare hvis en er i slutten av streng

Eksempel:.html >.htm #!/bin/bash for i in *.html do if [ f ${i/%html/htm} ] then echo "${i/%html/htm} already exists" else mv $i ${i/%html/htm} fi done

Fjerning av deler av en tegnstreng # Fjern korteste match fra starten av streng ## Fjern lengste match fra starten av streng % Fjern korteste match fra slutten på streng %% Fjern lengste match fra slutten på streng foo="this is a test" ${foo#t*is} is a test ${foo##t*is} ${foo%t*st} ${foo%%t*st} a test this is a

Ny utgave av.html >.htm #!/bin/bash for i in *.html do if [ f ${i%l} ] then echo "${i%l} already exists" else mv $i ${i%l} fi done

Tomme (null)strenger og defaultverdier Gir mulighet til å bruke en alternativ verdi hvis en variabel er tom (alternativt ikke-tom) Fire operatorer: : Bruk default verdi hvis streng er null := Bruk og sett default verdi hvis null :+ Bruk default verdi hvis streng ikke er null :? Skriv ut (feil)melding hvis streng er null

Eksempler fra kommandolinjen navn="" echo n ${navn: Jan}; echo $navn Jan echo ${navn:=jan}; echo $navn JanJan echo ${navn:+christian} Christian Navn="" echo ${navn:+christian} echo ${navn:?"navnet er ikke satt"} bash: navn: Navnet er ikke satt

Default verdier for parametre i shellprogrammer #!/bin/bash INFILE=${1: "infile"} OUTFILE=${2: "outfile"} sort $INFILE > $OUTFILE

Tabeller / arrays i shell Kan opprettes på flere måter: declare a array1 array2[3]=jan array3=( Jan Christian Robert Beathe ) array4=( [1]=Christian [0]=Jan [2]=Robert ) read a array5 array6=( $(ls) ) base_64=( {a..z} {A..Z} {0..9} ) Bruker {} for å hente ut innholdet i enkeltelementene i en tabell: echo ${array4[2]} echo ${#array4[2]}

Gjennomgang av hele tabeller #!/bin/bash declare a array1=( En To Tre Fire Fem ) echo ${array1[*]} # Hele tabellen skrives echo ${array1[@]} # ut på en linje echo ${array1[@]:0:5} echo ${#array1[@]} # Antall elementer # Formaterer utskrift, ett element per linje printf "%s\n" "${array1[@]}"

Gjennomgang av tabeller med løkker #!/bin/bash declare a array1=( En To Tre Fire Fem ) for a in ${array1[@]} do echo "$a (${#a} tegn)" done i=0 while [[ i lt ${#array1[@]} ]] do echo "array1[$i] = ${array1[$i]}" i=`expr $i + 1` done

Alle filer med file mode 755 i en katalog #!/bin/bash # Legger alle vanlige filer i en array temp=( $(find $1 maxdepth 1 type f) ) # Skriver ut navnet på filer med mode 755 for i in "${temp[@]}" do if ls l $i grep q "\ rwxr\ xr\ x" then # Fjerner path før selve filnavnet echo ${i##*/} fi done

Shellfunksjoner En funksjon i shell samler flere Linux kommandoer i en gruppe, slik at de senere kan brukes bare ved å referere til gruppens navn En shellfunksjon kjøres som en vanlig kommando i shellet, men starter ikke noen ny prosess Anvendelsesområder: Lage egne shortcuts for lengre, kompliserte kommandoer (se også alias under man builtins), slike legges ofte i oppstartfilen.bash_profile Gjenbruke kode i shellprogrammer / modularisere shellkode

Shellfunksjoner: Syntaks [function] funksjonsnavn () { kommando kommando... } Nøkkelordet function er valgfritt / kan sløyfes Funksjoner kan ta argumenter på kommando-linjen akkurat som shellprogrammer: Referanser til $1 $2 etc. inne i funksjonen er da lokale til funksjonen For å se koden til en funksjon: type funksjonsnavn

Eksempler: Shortcuts function lsext() { # Listing of files with given extension EXT=$1 ls l grep "^.*\.$EXT$" } function rpass() { # Create random strong password with # given lenght (default 12) LENGTH=${1: 12} cat /dev/urandom tr cd '[:graph:]' \ head c $LENGTH echo }

Eksempel: Gjenbruk av kode function stag () { echo "<$1>" } function etag () { echo "</$1>" } function tagtxt () { stag $1 echo $2 etag $1 } stag HTML stag HEAD tagtxt TITLE "Jan sin\ hjemmeside" etag HEAD stag BODY tagtxt H1 "Get lost" tagtxt P "The internet\ is full, go away" etag BODY etag HTML

Subshell Alle eksterne kommandoer som startes fra shellet genererer en ny prosess. Shellet har en del kommandoer som ikke starter en ny prosess, men som er innebygget i shellet og ligger resident i RAM for raskere utføring, se man builtins. Hvis bruker starter et shellprogram fra kommandolinjen, vil dette kjøre i en ny shellprosess et subshell og ikke i det opprinnelige login-shellet (sjekk $BASH_SUBSHELL) Bruk evt. source for å kjøre et program i opprinnelig shell En liste av kommandoer mellom paranteser vil kjøre i et subshell: ( command1; command2; command3;... ) Merk at shellfunksjoner ikke kjører i subshell

Overføring av variabelverdier til subshell Vanlige shellvariable eksisterer bare i det shellet der de er opprettet / deklarert Variable som opprettes i et subshell er ikke synlige for forelderprosessen/-shellet Variable fra foreldershellet kan eksporteres til subshell, som en kopi med samme verdi: export variabelnavn declare x variabelnavn Endringer av eksportert variabel gjort i subshellet vil ikke være synlige i foreldershell kjør i stedet shellprogram med source hvis dette er ønskelig

Overføring av shellfunksjoner til subshell Bourne Again Shell støtter også overføring av kode i shellfunksjoner til subshell: export f funksjonsnavn Det opprettes en shellvariabel som inneholder hele teksten som er koden til funksjonen Denne variabelen eksporteres slik at den blir synlig for subshellene Eksporterte funksjoner kan sees i listen over alle shellvariable som eksporteres: env eller printenv

Eksempel: Shellfunksjoner og subshell add () { echo `expr $1 + $2`; return 0; } export f add cat test_add #!/bin/bash add 4 6 exit 0./test_add 10

Flere iterative strukturer Har sett for og while i Bourne shell Andre mekanismer for iterasjon (og rekursjon): until samme syntaks som while, men løkken går så lenge det som testes på er false xargs Utfører en og samme kommando på f.eks. alle filene i en liste med filnavn find Kan utføre kommandoer på alle filer i et helt katalogtre

xargs Leser en liste med items (filnavn) fra standard input Utfører en gitt kommando en gang med hvert «item» som argument til kommandoen Eksempel: Lage kopier av alle html-filer i stående katalog: ls *.html xargs I{} cp {} old{} Se man xargs for mer info.

find find [opsjoner] katalog [uttrykk] find går gjennom alle filene i hele katalogtreet med rot i katalog uttrykk er en beskrivelse av hva som evt. skal gjøres med filene find har svært mange opsjoner som kan brukes til å endre funksjonalitet og f.eks. bestemme hvilke filer som skal behandles Eksempel: Sette tilgangskode på alle html-filer i hele katalogtreet med rot i stående katalog: find. name \*.html exec chmod 755 {} \;

find + xargs = sant Kan lage svært effektive (vær forsiktig...) kommandoer ved å la xargs jobbe på fillistene som genereres av find Fjerne alle filer under /tmp som heter core: find /tmp name core type f print \ xargs /bin/rm f Finne navnet på alle Java-filer i et helt katalogtre som ikke bruker Javas standard I/O-bibliotek: find java name \*.java print xargs\ grep vl "import java\.io\.\*;"

Mekanismer for seleksjon og gruppering ; Skilletegn mellom kommandoer på samme linje {} Gruppering av kommandoer () Gruppering av kommandoer i et subshell `` Kommandosubstitusjon && Utfør neste kommando bare hvis forrige OK Utfør neste kommando bare hvis forrige ikke OK && og er egentlig bare «forkortede if-tester»

&& og : Betinget eksekvering grep q Levon filnavn && echo ": )" if grep q Levon filnavn then echo ": )" fi grep q Levon filnavn echo ": (" if!grep q Levon filnavn then echo ": (" fi

Komprimering av kode med && og if [ f $filnavn ] then rm filnavn else echo "No regular file $filnavn found" exit 1 fi [ f $filnavn ] && rm $filnavn { echo "No\ regular file $filnavn found"; exit 1; }

Tidsbestemt kjøring av kommandoer og shellprogrammer sleep: Vent en bestemt tid før neste kommando { sleep 2h; sort BIGfile > SORTEDfile } & at: Start utføring av shellscript på et bestemt tidspunkt at 4:30 am tomorrow < shellprogram at now + 3 days < shellprogram at 11:00am Monday < shellprogram at 5:00pm Feb 15 2015 < shellprogram atrm [jobnr] fjerne utførelse fra «ventekøen»

Et shellprogram som kjører seg selv en gang i uken #!/bin/bash if who grep q janh then echo "Har ikke du fått sparken ennå?" fi cat $0 at now + 1 week

Debugging og testing av shellprogrammer Shellprogrammering krever prøving og feiling Feilmeldinger fra shell er sparsomme og kryptiske Test hver ny linje interaktivt Bruk f.eks. emacs til testing av linjene etterhvert som de skrives Debuggingsopsjoner (se også man bash): bash v program Skriver ut kodelinjene etterhvert som de utføres bash x program Skriver ut kommandoer som utføres og verdien av variable som brukes