Bourne shell
informasjon
oppdatert: Fredag 23. august 2002
Bourne shell

Shell betegner karakterbaserte brukergrensesnitt til operativsystemet. Shellet oversetter instruksjoner på kommandolinjen til kommandoer operativsystemet forstår. På våre webhotell er følgende shell tilgjengelige:
Shell Ant. kommandoer Ant. environment-variabler
sh (Bourne shell)    
bash (Bourne again shell) 48 12
csh (C-shell)    
tsch (emulering av C-shell) 53 18
ash 24 10
Bourne er trolig det mest utbredte shell-scipt språket. Nær sagt Alle UNIX og Linux systemer støtter script skrevet i Bourne-shell. Vi anbefaler deg derfor å skrive Bourne-script for å sikre portabilitet. For interaktiv bruk er Bash et populært shell på Linux. Ved interaktiv bruk tilbyr Bash i forhold til Bourne-shell muligheter for autocomplete av både kommandoer og filnavn. Bash er en utvidelse av Bourne og alle Bourne-script kan kjøres i Bash-shell. Det er også mindre endringer som må utføres for å kunne kjøre Bourne-script i Korn-shell (vi tilbyr ikke dette shell). Den videre omtale har gyldighet for Bourne-script.

I scriptet spesifiserer en på første linje hvilket shell en benytter. Alle shell-programmene på våre webhotell ligger i katalogen /bin/. Første linjen i scriptet blir dermed som følger
#! /bin/sh

echo "Content-type: text/html"
echo
echo "<html>"
echo "<head>"
echo "<title>direkte.sh</title>"
echo "</head>"
echo "<body>"
echo "Dette er skrevet av Bourne-skriptet \"demo.cgi\""
echo "</body>"
echo "</html>"

Skriptet over innholder videre et hodefelt som må være separert fra resten av innholdet med en blank linje. For å aksessere dette scriptet via link-element trykk her. For VIKTIG informasjon om hodefelt, filrettigheter og filekstensjoner se webserver-programmering.

Variabler
Bourne-shell har kun tekst variabler. Som i det fleste script-språk trenger en ikke definere variabler før de brukes. Er ikke variabelnavnet tidliger brukt blir automatisk en ny variabel generert ved tilordning. Det er flere måter å tilordne en variabler verdier:
variabelnavn=verdi Tilordner "verdi" til variable med navnet "variablenavn"
variabelnavn+verdi Hvis "variablenavn" allerede er i bruk tilordnes verdien
variabelnavn:?verdi Hvis "variablenavn" allerede er i bruk skrives det ut en brukerdefinert feilmelding
variabelnavn?verdi Hvis "variablenavn" allerede er i bruk skrives det ut en systemdefinert feilmelding
variabelnavn:=verdi Hvis "variabelnavn" ikke allerde er tilordnet verdi blir "verdi" tilordnet
variabelnavn:-verdi Hvis "variabelnavn" ikke allerde er tilordnet verdi skal "verdi" brukes, men tilordnes ikke variablen

Med unntak av den første tilodningen funger kun de andre i subshell om må omsluttes av ${variabelnavn=verdi}. Subshell kan benyttes i parameterverdier til kommandoer.

En referer vanligvis til variabler ved å prefikse variablenavnet med dollar tegn. Verdier som innholder blanke tegn må omsluttes av doble eller enkle anførselstegn. Variabler kan slettes ved bruk av kommandoen: unset variablenavn. Variabel kan settes til kun å være lesbar ved følgende kommando: readonly variablenavn. For oversikt over variabler som kun er lesbarer kan følgende kommando benyttes: readonly.

Det er fire typer av variabler: Lokale, environment-, parameter, og spesielle-variabler.

Lokale-variabler
Lokale variabler tilordnes verdier innenfor et script eller prosess og er kun synlig innenfor scriptet eller prosessen. For utskrift av alle lokalt definerte shell-variabler kan en bruke kommandoen set. Listingen kan være ganske lang da shellet automatisk setter opp mange lokale variabler.

Environment-variabler
En environment-variabel er tilgjenelig for alle prosesser. En variabel kan etter tilordning gjøres global ved følgende kommando export variablenavn. For utskrift av alle environment variabler bruk kommandoen env. Det er vanlig praksis å bruke store bokstaver i environment-variabelnavn. For nærmere omtale av environment-variabler som settes av webserveren, trykk her.

Parameter-variabler
Når en sender parametere inn til et shell-script kan disse aksesseres i scriptet ved hjelp av variablene $1 til $9. Der $1 innholder første argumenet, $2 andre argument, osv. $0 innholder navnet på scriptet. Er det flere enn 9 parametere til scriptet må de øvrige aksesseres ved hjelp av kommanoden shift. Kommandoen shift setter $1 lik $2 og $2 lik $3 osv. $9 blir tilordnet neste argument til scriptet. $0 blir ikke påvirket av shift. Kommandoen getopt kan også benytte til å lese ut argumenter, eller mer presist "options" til scriptet. Generell syntaks til UNIX og Linux kommandoer er kommando opsjon argument1 argument2 ... Opsjon er her argumenter som er kun en bokstav prefikset med munistegn og følger direkte etter kommandoordet. Flere etterfølgende opsjoner kan trekkes sammen til en slik at alle bokstavene kun blir prefikset med et minustegn. Gjentatte kall på getopt vil sekvensielt lese ut opsjonene. Generell syntaks til kommandoen er getopt gyldigeopsjoner variabelnavn. Utlest opsjon vil plasseres i oppgitt variabel, men først vil det kontrolleres at opsjonen er blandt de gyldigeeopsjonene. Gyldige oppsjoner oppgis som en sekvens av bokstaver. Påtreffes ikke gyldig opsjon plasseres ? i variablen og feilmelding skrives ut.

Spesielle-variabler
Det er 7 spesielle variabler, deriblandt $? som innholder exit-status til script.
$# Antall argumenter til et script
$* En streng som innholder alle argumenter til scriptet
$$ PID til prosessen som kjører scriptet
$! PID til forrige prosess som ble plassert i bakgrunden
$@ Samme som $* men hver parameterverdi er omsluttet av doble anførselstegn
$- Viser alle environment-variabler
$? Innholder exit-status til siste kommando som ble utført. 0 betyr ok og alle andre vedier er en feil

Kommandoer
Generell syntaks til kommandoer er kommando options parameter1 parameter2 ... Hver kommando er et program. Kommandoprogrammene kommer gjevnelig i nye versjoner med flere opsjoner. Vær oppmerksom på at bruk av de nyeste opsjonene gjøre scriptet mindre portabelt. Bourne shell har rundt 50 kommandoer. Disse vil ikke bli gjennomgått her med unntak av noe som er meget vanlige i script, men ikke så vanlig for interkative brukere.

Shell intepreteren prøver å tolke første ordet den finner på kommandolinjen som en kommando, med noe noe få unntak. I kapittelet over om "Variabler" så vi at bruk av tilordningstegn kan hindre dette. Det er også mulig å få intepreteren til å begynne lese inn en ny kommanod på et tilfeldig sted på kommandolinjen ved å ved bruk av bakoverlent enkle anførselstegn. Alt som befinner seg mellom to bakoverlent enkle anførselstegn prøver intepreteren å tolke som en ny kommando, eks: echo `date`. I stedet for anførseltegnene er det også mulig å omslutte kommandoene med paranteser prefikset med dollartegn, eks: echo $(date).

Det er mulig å gruppere to kommandoer slik at siste kommando utføres eller ikke med hensyn til om første kommando returnerer exit-status lik 0. Dette hendholdvis følgende syntaks kommando1 && kommando2 og kommando1 || kommando2.

test
Denne kommandoen er vanlig i if- og while-konstruksjoner i script. Kommandoen setter status-variablen, $?, til 0 om testen er sann eller til 1 om testen feiler. Kommanondoen har to valgfrie og likeverdige syntakser test betingelse og [ betingelse ]. Legge merke til mellomrommet mellom hakeparantesen og betingelsen. Betingelsen gjelder enten filer, tekststrenger eller tall.

Vanlige filbetingelser er.
[ -d katalognavn ] Dette er en katalog
[ -f filnavn ] Dette er efn fil
[ -L linknavn ] Dette er en symbolsk link
[ -r filnavn ] Dette er en lesbar fil
[ -s filnavn ] Dette er en fil som ikke er tom
[ -w filnavn ] Dette er en skrivbar fil
[ -u filnavn ] Dette er en suid fil
[ -x filnavn ] Dette er en kjørbar fil

Vanlige tekststrengbetingelser
[ streng1 = streng2 ] Strengene er like
[ streng1 = streng2 ] Strengene er ulike
[ -z streng1 ] Streng1 er tom
[ -n streng1 ] Streng1 er ikke tom

Vanlige tallbetingelser
[ tall1 -eq tall2 ] Tallene er like
[ tall1 -ne tall2 ] Tallene er ulike
[ tall1 -gt tall2 ] tall1 er større enn tall2
[ tall1 -ge tall2 ] tall1 er større eller lik tall2
[ tall1 -lt tall2 ] tall1 er mindre enn tall2
[ tall1 -le tall2 ] tall1 er mindre eller lik tall2

Logiske operatorer
[ betingelse1 -a betingelse2 ] Testen er sann om begge betingelsene er sanne
[ betingelse1 -o betingelse2 ] Testen er sann om en av betingelsene er sann
Betingelsene kan negeres ved prefiksing med utropstegn.

expr
Kommandoen utfører bl.a. enkle aritmetriske utregninger. Husk at all variabler lagres som tekststrenger. Multiplikasjonentegnet må prefikses med med bakoverlent skråstrek slik at det ikke blir betraktet som listing av innholdet i directory.
expr tall1 + tall2 Summen av tall1 og tall2
expr tall1 - tall2 Differansen av tall1 minus tall2
expr tall1 / tall2 Kofisienten av tall1 delt med tall2
expr tall1 \* tall2 Produktet av tall1 multiplisert med tall2

grep (Global Regular Expression Print)
Kommandoen skriver ut utvalgte linjer i en fil med hensyn til et regulært utrykk. Generell syntaks til sed-kommandoe er:
grep opsjoner " regulært utrykk " filnavn
Det regulære utrykket kan erstattes av en streng. De doble anførseltegnene kan byttes ut med enkle anførselstegn. Anførselstegnene kan utelates når utrykket kun innholder et ord. Filnavnet kan innholde vanlig wildchar notasjon slik at grep søker igjennom flere filer samtidig i katalogen. Nedenfor følger liste av vanlig opsjoner

-c Tell (count) antall linjer som matcher
-H Prefiks (header) linjer som skrives ut med filnavn
-h Ikke prefiks linjer med filnavn
-I Overse (ignor) binære filer
-i Overse (ignor) forskjeller mellom store og små bokstaver
-l Skriv kun ut filnavn ved søk igjennom flere filer
-n Nummerer (number) alle linjer som skrives ut
-r Søker også i underkataloger
-s Skriv ikke ut feilmeldinger om ikke eksisterende filer
-v Invers (invert) utskrift, slik ikke matchene linjer skrives ut

For omtale av regulære utrykk se dokumentasjon av javascript. Til forskjell må klammeparantese for angi repetisjon prefikses med bakoverlent skråstrek for unngå sammenblandig med shell kommandoen for subshell, eks 3 etterfølgende a-tegn blir utrykket: a\{3\}. Videre har tegnklassen andre navn med unntak av \w og \W.

[[::alnum:]]Ekvivalent med [a-zA-Z0-9]
[[::alpha:]]Ekvivalent med [a-zA-Z]
[[::upper:]]Ekvivalent med [A-Z]
[[::lower:]]Ekvivalent med [a-z]
[[:digit:]]Ekvivalent med [0-9]
[[:space:]]Ekvivalent med [\t\n\r\f\v]

Det finnes også to utvidede versjoner av grep: egrep og fgrep.

Eksempel på søk etter linjer som innholder dobbel "a" i filen test.txt. Eventuelt linjer funnet blir prefikset med linjenummer.
grep -n "a\{2\}" test.txt

Eksempel på søk etter linjer som innholder "abc" eller "def"i filen test.txt.
grep "abc\|def" test.txt

sed (Stream EDitor)
Sed kan leser en fil (eller standard input stream), utføre vanlig teksteditering og deretter returnere resultatet til standard output stream. Tekstediteringen baserer seg på lokalisering av linjene som skal oppdateres ved bruk av regulært utrykk. Sed endrer aldri innoldet i kildefil. Unnlates navnet på kildefil blir editering utført på standard input stream. Generell syntaks for bruk av sed-kommandoen er:
sed opsjoner 'linjeadresse sedkommando' kildefil

En kan også lage egne sedscript-filer inkluderes på følgende måte i kommandoen
sed opsjoner -f sedscript kildefil

Innholder sedscript på første linje #! /usr/bin/sed -f kan sedscriptet kjøres direkte (må ha kjøre rettigheter). Scriptet kalles som følger
sedcript-navn opsjoner kildefil

Oppgis ikke opsjonen -n vil alle linjer i kildefilen skrives til standard ouput. Ved bruk av flere flere sedkommandoer på kommandolinjen må opsjonen -e benyttes.

Adressering av linjer i kildefilen kan gjøres ved direkte å oppgi linjenummer, benytte regulært utykk eller kombinere dette. Oppgis ikke adresse vil editeringskommandoen blir utført på alle linjer. En kan benytte $ for å angi siste linje i filen. Etter adressen kan legge til ! for å velge ut linjer som ikke matcher adressen.
x x angir linjernummer
x,y alle linjer fra og linje nummer x til og med y
/utrykk/ alle linjer som matcher det regulære utrykket
/utrykk/utrykk/ alle linjer som matcher begge de regulære utrykk
/utrykk/,x alle linjer fra linjenummer x til første linje som matcher det regulære utrykket
x,/utrykk/ alle linjer fra første linje som matcher det regulære utrykket til og med linjenummer x

Her følger kort beskrivelse av vanlige sed-kommandoer der en må adressere enkelt linjer
a\
ny linje 1\
ny linje 2
legger til nye tekst etter oppgitte linjer
i\
ny linje 1\
ny linje 2
legger til nye tekst før oppgitt linjer
r filnavn legge til tekst lest fra annen fil

Her følger kort beskrivelse av vanlige sed-kommandoer der det også er lovlig å oppgi et adresse område.
p skriver ut linjer
= skriver ut linjenummer
d slette linjer
s/utrykk/bytte til/opsjon bytter ut forekomsten som matcher det regulære utrykket med "bytte til". Opsjonenene er: g p w n. Opsjon g bytter ut alle forekomster som matcher (er default). Forekomsten som er påtruffet kan refereres til med & i "bytte til" teksten.
c\ bytte ut linjer med ny linje
w filnavn skriver utvalgte linjer til fil
q skriver ut alle linjer fram til første adresserte forekomst

Eksempel på utskift av de 4 første linjen i filen test.txt
grep -n '1,4p' test.txt

Eksempel på å legge til linjenummer for filen test.txt
grep = test.txt

Eksempel på endring av innhold fra standard input. Her endres "sekk" til "sokk"
echo "sekk" | sed "s/o/e/g"

Eksempel på innsetting av linjene:
insatt linje 1
insatt linje 2

etter linjer i filen test.txt som innholder ordet "java"
sed '/java/a\
sjekk\
dette' test.txt

Eksempel på sletting av linjene som innholder ordet "java" i filen test.txt
sed '/java/d test.txt

cut
Cut kan lese kolonner/felt fra linjer/records fra filer eller standard input stream.

Eksempel: Lese ut tegnene 2 til og med 5, samt tegn 8 fra filen test1.txt og test2.txt
cut -c2-5,8 test1.txt test2.txt

Eksempel: Sette felt separator til : (kolon) og lese ut felt 2 og 4 samt feltene 7-9 fra filen test.txt
cut -d : -f 2,4,7-9 test.txt

tr
Tr leser fra standard input og oversetter tegn/ord til angitt tegn/ord.

Eksempel: Endre alle "a" til "b" i filen test.txt
tr "a" "b" < test.txt

Eksempel: Endre fra små- til store-bokstaver i filen test.txt
tr "[a-z]" "[A-Z]" < test.txt

Eksempel: Fjerne to eller flere like bokstaver etterhverandre i filen test.txt
tr -s "[a-z][A-Z]" < test.txt

Eksempel: Fjerne blanke linjer i filen test.txt
tr -s "[\012]" < test.txt

awk
Vi vil her se nærmere på gawk som er utvidelse av awk. Ved hjelp av dette verktøyet kan en generere rapporter eller gjøre utrekk av data fra filer som innehoder record. Recordene er separert med faste skilletegn. Feltene i recorden kan ha forhåndsdefinert lengde eller fast skilletegn. Gawk lesere inn en og en record fra kildefilen og utfører alle tilhørende gawk-statment på denne recorden før neste record leses inn. Gawk definere et eget script språk med en rekke ferdig definerte funksjoner og variabler. I script språket kan en definere egne variabler og benytte flytkontroll mekanismer som if-tester, for- og while-løkker samt definerere egne funksjoner for styring med hva som skal utføres på hver enkelt record. Gawk bruker ikke minst regulære utrykk for å selektere recorder. Denne beskrivelsen er bare en kort introduksjon og detaljer må leses i annen litteratur.

Tilsvarende sed er det tre måter starte gawk på. Generell syntaks for gawk-kommandoen er:
gawk opsjoner 'gawk-kommandoer' varnavn=verdi kildefil

En kan samle awk-kommandoer i egne script som kan kalles på følgende måte i kommandoen
gawk opsjoner -f gawk-script varnavn=verdi kildefil

Innholder awkscript på første linje #! /bin/gawk -f kan gawkscriptet kjøres direkte (må ha kjøre rettigheter). Scriptet kalles som følger
gawk-scriptnavn opsjoner varnavn=verdi kildefil

Utelates navn på kildefil leser gawk standard input stream. Gawk-kommandoene er omsluttet av enkle anførseltegn på kommandolinjen. Syntaksen til gawk-kommanoder er som følger
gawk-pattern {gawk-statements}
Her kan enten gawk-pattern eller gawk-statments være utelatt. Gawk-statements kan innholde flere gawk-statement som er avskilt med semikolon. Gawk-pattern
Med gawn-pattern menes

  • BEGIN
  • END
  • /regulært utrykk/
Etter gawk har startet utføres først statments prefikset med BEGIN. Etter gawk er ferdig med å lese alle kildefilen utføres statments prefikset med END. Gawn-statments som ikke prefikset med gawn-utrykk vil bli utført for alle record. Gawk kontrollerer først om recorden matcher gawk-utrykket før tilhørende gawk-statments utføres. Gawk-pattern kan også innholde en logisk sammensetning av to regulære utrykk. Det sammensatte utrykket må omsluttes av vanlige parenteser.

(/regulært utrykk/ && /regulært utrykk /) begge de regulære utrykk må tilfredstilles
(/regulært utrykk/ || /regulært utrykk /) ett av de regulære utrykk må tilfredstilles
(/regulært utrykk1/ ? /regulært utrykk2 / : /regulært utrykk3 /) Matcher recorden utrykk 1 benyttes utrykk2 ellers utrykk3
(!/regulært utrykk/ sjekker om record ikke matcher utrykket

Gawk-variabler
Gawk-variabler tilordnes verdi i statments og det benyttes tilsvarende syntaks som for vanlig Bourne-shell-variabler. Til forskjell er det to tre typer gawk-variabler: streng, float og array. For å refere til gawk-variabler benyttes kun variabelnavn (uten prefiks med dollar-tegn som i Bourne-shell). For referanse til elementer i array-variabler benyttes vanlig array-notasjon: arrayNavn[n], der n er indeks i arrayen. Ved innlesning av en record blir verdiene i hvert felt plassert i variablene $1, $2, $3 osv. $0 er referanse til hele recorden.

Gawk har en del standard variabler som bestemmer oppførselen til standard funksjonen.
ARGC Antall argumenter på kommando-linjen
ARGV Array innholdene argumenter oppgitt på kommando-linjen
ENVIRON Array innholden environment variabler. F.eks ENVIRON["QUERY_STRING"]
FNR Antall record lest fra inneværende fil
FS Felt seperator
NF Antall felt i innlest record
NR Antall record lest totalt så langt
OFS Felt skilletegn i utskriftfil
ORS Record skilletegn i utskriftfil
RS Record skilletegn
FIELDWITHS Ved tilordnig benyttes faste feltlengder til å separerer felt. Tilordnes en kommaseparert liste med tall
OFMT utskrift format til tall. Default "%.6g"
IGNORECASE Kontrollere om det skal eller ikke skal skilles mellom store og små bokstaver ved regulære utrykk og tekst operasjoner

Vanlige opsjoner til gawk-kommandoen er -F og -v. Opsjonen -F sufikses med felt-skilletegnet. Default skilletegn er blank. Opsjon -v etterfølges av varnavn=verdi. Opsjon -v benyttes for å tilordne variabler verdier før gawk starter. Etter oppstart av Gawk programmet utføres først statments prefikset med BEGIN deretter utføres tilordninger til variabler som eventuelt er oppgitt før filnavnene. Filnavnene leses inn i ARGV-arrayen. Deretter starter innlesning av record fra kildefil og utføring av tilhørende statements.

Gawk-statement
Gawk-statement har vanlig variabel-tilordning, if-tester og løkke-konstuksjoner basert på c-syntaks. Klammeparanters har riktignok en annen betydning i gawk-script enn i java og c. Statements i gawk kan grupperes ved hjelp av vanlige paranteser. Gawk har de samme operatorene som i java og c slik som +, -, *, /, %, ++, --, &&, ||, osv. I tillegg har gawn en, ~, tilde-operator for match av regulære utrykk i betingelser. !~ /regulært utrykk/ er sant om det ikke er match. Nedenfor følger opplisting av standard statement og funksjoner i gawk

Gawk kontroll-statement (i beskrivelsen under er "i" et tilfeldig valg variabelnavn).

  • if ( betingelse ) statement else statement
  • while ( betingelse ) statement
  • do statement while (betingelse)
  • for ( i=0; i<tall; i++) statement
  • for ( i in arraynavn ) statement
  • break
  • continue
  • delete arraynavn [index]
  • delete arraynavn
  • exit tall
Gawk IO-statement benyttes til utskrift av record. Ulike felt kan skrives ut i ulike formater. Det er i IO-statement for å avslutte innlesning av en fil og forsette innlesning fra en annen fil. Den mest vanlige IO-statment er print somskriver til standard output stream. En kan etter nøkkeordet oppgi en komma-separert liste med de feltverdier som skal skrives ut. Se annen dokumentasjon for ytterligere detaljer.

Gawk tekst-funksjoner
gsub(r,s) Bytter til s for alle forekomster av r i recorden
gsub(r,s,t) bytte til s for alle forekomster av r i t
index(s,t) returnere første posisjon av t i s, eller 0 ved ingen forekomster
length(s) lengden til strengen s
tolower(s) returnerer en kopi av strengen der alle bokstaver er representert med små bokstaver
toupper(s) returnerer en kopi av strengen der alle bokstaver er representert med store bokstaver
match(s,r) tester om s innholder en substring som matcher det regulære utrykket r
split(s,a,fs) deler opp s i array a der deletegn er fs
sprint(fmt,exp) skriver ut et exp i henhold til fmt
sub(r,s) tilsvarende gsub med kun utbytting av første forekomst
substr(s,p) returnerer resten av s fra og med posisjon p
substr(s,p,n) returner n tegn av s fra of med posisjon p

Gawk tall-funksjoner omfatter cos(), sin(), sqrt(), srand(), rand(), log(), exp(), int(), atan(). Funksjonen rand() returnerer et tilfeldig tall

Gawk tids-funkjoner omfatter systime() og strftime(). Funksjonen systime() returnere sekunder etter 1. januar 1970. Funksjonen strftime() kan benyttes til å returnere en formatert dato.

eval
Eval-kommandoen tar en kommando som argument. Først utføres oppgitt kommando som normalt. Deretter betraktes resultatet som en ny kommando som utføres.

exit
Kommandoen benyttes til stoppe utføringen av et script eller prosess å setter verdien til status-variablen. Eks exit 1.Status-variablen, $?, vil ha verdien 1 før neste kommando utføres.

exec
Kommandoen benyttes til å erstatte eksisterende shell med et nytt og alle eksisterende environment-variabler fjernes.

Eksempel: Starte z-shell
exec zsh

tee
Kommandoen leser standard input stream og sender resultatet videre til både standard output og til fil

Eksempel: Eksempel der standard input stream sende til videre til standard output og tilleggsfilen res.txt
tee -a res.txt

Flytkontroll
I dette kapitellet skal vi se på språk konstruksjoner som effektiviserer og strukturere skrivingen av script.

if-test
Generell syntak til if-konstuksjonen
if utsagn1
then

   kommandoer1
elif utsagn2
then

   kommandoer2
else
   kommandoer3
fi
Hvis utsagnet setter status-variablen til 0 (sant) utføres if-grenen ellers utføres else-grenen. Utsagn er her et samlebegrep for kommandoer og funksjoner. Mest brukte kommandoen i if-test er test-kommandoen: [ betingelse ]. I stedet for å skrive then på egen linje er det mulig å legge til et semikolon etter utsagnet og plassere then på samme linje.

case-test
Generell synaks til case-konstruksjonen
case verdi in
mengde1)
   kommandoer1
   ;;
mengde2)
   kommandoer1
   ;;
esac
Det er vanlig at "verdi" over er en referanse til en variabel. Variablenverdien blir testet om den eksisterer i "mengde1", deretter i "mengde2" om den første testen ikke var sann. Mengdene kan være en tekststreng eller innholde mange tekststrenger ved bruk av * og ? notasjon.

for-løkke
Generell synaks til for-konstruksjonen
for variabelnavn in liste
do
   kommandoer
done
Listen inneholder en sekvens av verdier. Variablen tilordnes en ny verdi i gitt rekkefølge i starten på hvert gjennomløp av løkken. Løkken stopper når alle verdier i listen er benyttet. Listen er en streng med eller uten anførselelstegn rundt. Hvert element i listen må være separert med et eller flere blanke tegn. I stedet for å ramse opp elementene i for løkken er det mulig å benytte referanse til variabler som innholder elementene eller utføre en kommando som generer elementene, f.eks `more elementfil`, der elementfil innholder elementene. PS: Kommandoen må være omsluttet av enkle bakoverlent anførselstegn.

until-løkke
Generell synaks til until-konstruksjonen
until utsagn
do
   kommandoer
done
Hovedforskjellen mellom until- og while-løkken er henholdvis at sannhetsverdien til utsagnet beregnes etter eller før kommandoene i løkken.

while-løkke
Generell synaks til while-konstruksjonen
while utsagn
do
   kommandoer
done
Hvis utsagnet setter status-variablen til 0 (sant) utføres kommandoene i løkken. Se forklaring av if-tester for viderbeskrivelse av utsagn.

funksjoner
Generell synaks til funksjoner er
function funksjonsnavn ()
{

   kommandoer
}
eventuelt ekvivivalent og noe forkortet skrivemåte:
funksjonsnavn (){
   kommandoer
}
Funksjoner kalles som kommandoer ved kun å oppgi funksjonnavnet med eventuelle argumenter. I funksjoner kan argumenter leses på tilsvarende måte som argumenter til script. En kan tenke på en funksjon som et separat script, men enkelt store forskjeller. Funksjoner blir lastet inn i memory samtidig med scriptet og kjøres i samme shellet og kan lese lokalt definerte variabler. Kall på script starter opp en nytt separt shell. Tilsvarende kommandoen exit tall for script benyttes return tall i funksjoner. I begge tilfeller settes status-variablen til verdien "tall".

Funksjoner kan generelt sett defineres innenfor et script eller egne funksjon-filer. I det siste tilfelle kan en rebruke funksjoner i mange script.

Det er en vanlig konvensjon å prefikse variabelnavn definert i funksjoner med lav bindestrek.

Eksempel
Her følger skriptet som er benyttet i skjema omtalt i dokumentasjonen av HTML. Vi har lagt inn linjenummer for å referere til kommandoer (linjenummerene må fjernes før skriptet kan kjøres).
  1. #!/bin/sh
  2. echo "Content-type: text/plain"
  3. echo
  4. LINJE=`echo ${QUERY_STRING} | sed 's/&/ /g'`
  5. for LOOP in $LINJE
  6. do
  7. ID=`echo $LOOP | sed 's/=/ /g' | awk '{print $1}'`
  8. VERDI=`echo $LOOP | sed 's/=/ /g' | awk '{gsub("%","\\\x"); print $2}' | sed 's/+/ /g' `
  9. V=`printf "$VERDI"`
  10. eval `echo "${ID}=\"${V}\""`
  11. done
  12. echo $epost
  13. melding="Denne mail er usendt av et test eksempel vi har av HTML i kombinasjon med Bourne shell-skript, der vi oppfordrer kunder til å skrive inn egen e-postadresse. Vi beklager om oppgitt e-postadresse ikke er korrekt. E-postadressen og eventuell annen oppgitt informasjon blir uansett ikke lagret hos oss\n\nMed vennlig hilsen\n\nREGISTRAR.NO"
  14. printf "$melding" | mailx -a "From:info@registrar.no" -s "Demo av HTML og Bourne-skript" $epost

Skriptet parserer QUERY_STRING slik at det lages en lokal variabel for hver -"record" i QUERY_STRING. Hver record i QUERY_STRING er på formen parameternavn=paremeterverdi. Skriptet lager en lokal variabel for hver record og kaller den "parameternavn" og tilordner den "parameterverdi". For syntaks til QUERY_STRING se Webserver-programmering. Innholdet i QUERY_STRING parseres på følgende måte:

  1. Alle forekomster & må erstattes av linjeskift (splitter opp i record)
  2. Alle forekomster = erstattes av space (splitter record opp i felt)
  3. Alle forekomster + erstattes av mellomrom
  4. Alle forekomster % erstattes av \x (kan dermed bruke standardfunksjon printf for å dekode heksadesimal-kodet tegn
Dette utføres av skriptet på følgende måte.
  1. Angir hvilket shell som skal behandle skriptet
  2. Skriver ut obligatorisk hodefelt
  3. Linjeskift som skiller hodefelt fra selve "body"
  4. Inne i anførseltegnene vil echo-kommando skrive innholdet i QUERY_STRING til standard output. Standard output pipes inn i sed-kommandoen. sed-kommandoen subsituerer alle &-tegn med mellomroms-tegn og skriver resultatet til standard output. Til slutt tilordnes den lokale variablen LINJE resultatet.
  5. På linje 7 vil går en løkke igjennom alle ord (record) i variablen LINJEN avskilt med blanktegn. Hver record tilordnes den variablen LOOP
  6. Leser ut parameternavnet til recorden. Dette gjøres ved at sed-kommandoen første substituerer mellomromstegn for likhetstegnet som skiller de to feltene i recorden. Deretter benyttes awk-kommandoen til lese ut verdien i første feltet. Den lokale variablen ID tilordnes parameternavn.
  7. Linjen starter likt som linje 10, men i awk-kommandoen substituerere en også alle % med \x og leser ut felt nummer 2. I den siste sed-kommandoen erstattes alle pluss tegn med mellomrom.
  8. På linje 11 konverteres alle heksedesimale representasjoner av tegn i variablen VERDI ved hjelp av printf-kommandoen. Printf-kommandoen fungerer tilsvarende printf-funksjonen i c-programmering.
  9. Eval-kommandoen benyttes for dobbelt gjennomløp av etterfølgende kommando. I første omgang vi echo kommanoden utføres og resultere i en streng. Denne strengen blir utført som en kommando i neste omang.
  10. Til slutt på linje 15 leser vi ut verdien til den lokale variablen "navn", som er blitt laget av for-løkken.
  11. Tilordner variablen "melding" innholdet i mailen
  12. Skriver innholdet i variablen "melding" til standard ut. Standard blir pipet inn i programmet "mailx". Mailx er en mailklinet tilsvarende "mail", men i tillegg muligheter for å spesifisere avsender. Her benyttes opsjonene -a og -s til "mailx" for å kunne spesifisere henholdvis avsender og subject. Deretter følger mottager av e-posten. For oversikt over mulige opsjoener til "mailx" kan du opprette en SSH-forbindelse til webhotellet og gi kommandoen: mailx --help.
Dette er generelt sett meget anvendelig kode for webserver-programmering i bourne-shell.