Lab report 6 done

This commit is contained in:
Jack-Benny Persson 2013-12-23 09:00:23 +01:00
parent 45fd525023
commit ca12003816

View File

@ -1,7 +1,81 @@
# Laborationsrapport 5 #
## Syfte ##
Ha koll på funktioner i bash, samt hur man passar ett argument till ett skript
eller funktion!
## Tillvägagångssätt ##
Övningar genomförs i vanlig ordning enligt nedan. När det gäller att passa
argument till Bash-skript finns det flera olika alternativ förutom $1, $1 osv
som listas i laborationsbeskrivningen. Den mest flexibla och enkla av dessa
alternativ tycker jag är _getopts_ för passa flaggor till Bash-skript. Det finns
även _getopt_, alltså i singular, men denna kan vara lite klyddigare att jobba
med. I [Övning 4, version 2, labb
5](https://github.com/jackbenny/scripts_grundkurs/blob/master/Labb5/ovning4_ver2.sh)
använder jag _getopts_ för att få options/flaggor till scriptet. En liten
förklaring kan här vara på sin plats.
```bash
while getopts f:o:G:V:h Opt; do
case "$Opt" in
f) if [ ! -r $OPTARG ]; then
echo "Can't read $OPTARG" > /dev/stderr
short_help
exit 2
fi
Form="$OPTARG"
;;
o)
if [ ! -w `dirname $OPTARG` ]; then
echo "You can't write to `dirname $OPTARG`"\
> /dev/stderr
exit 2
fi
Outfile="$OPTARG"
;;
G) G=$OPTARG
;;
V) VG=$OPTARG
;;
h) long_help
exit 0
;;
*) short_help
exit 2
;;
esac
done
```
I skriptet ovan på första raden `while getopts f:o:G:V:h Opt` anges flaggorna
som skriptet accepterar (här -f -o -G -V -h). De flaggor med ett kolon (:) efter
sig kräver ett argument. Argumentet till flaggan läses sedan in i variabeln
$OPTARG som också syns i ovan script.
Notera också ovan att man i case-satsen ej behöver ange bindestrecket före
flaggan, detta fixar _getopts_ själv.
Man kan även ha stor nytta av $0, d.v.s argument 0, som i Bash syftar på skripet
självt. $0 kommer alltid att visa hela sökvägen till skriptet som körs. D.v.s
startar man skriptet med ./script.sh kommer $0 vara just ./script.sh. Om man
däremot startar skriptet med ./home/jake/script.sh kommer $0 vara
./home/jake/script.sh.
Vill man att $0 alltid bara ska vara script.sh, om man t.ex. vill veta om
skriptet anropats direkt med script.sh eller med någon länk får man kapa av alla
katalogerna i början. Detta gör man enklast med _basename_.
I [Övning 4](https://github.com/jackbenny/scripts_grundkurs/tree/master/Labb6/ovning4)
på denna labben har jag använt mig av just `basename $0` för att skapa
kalkylatorskriptet. Jag gjorde som så att jag skapade ett skript som sedan kan
anropas med 4 olika symboliska länkar. Beroende på vilken länk som används så
utför skriptet olika funktioner.
Det finns även _dirname_ som görs precis tvärtom vad _basename_ gör, d.v.s.
istället för att skala bort alla kataloger före, så skalar _dirname_ bort själva
skriptnamnet och kvar blir bara sökvägen fram till skriptet.
## Reflektion ##
När det kommer till arrayer så fick jag en trevlig pull request av Paulena som
hade förenklat mitt
[test_array.sh](https://github.com/jackbenny/scripts_grundkurs/blob/master/Labb6/test_array.sh)
med flera rader kod. Istället för att göra en räknare och en loop för att läsa
in katalogerna i en array visade Paulena här att man helt enkelt bara kunde
läsa in hela ls-outputen med `Content=($(ls))`. Så mycket snyggare och enklare.
De yttre paranteserna anger arrayen och de inre paranteserna anger att ls skall
exekveras (samma som backticksen).