3.5 KiB
Laborationsrapport 5
Jack-Benny Persson
LX13
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 använder jag getopts för att få options/flaggor till scriptet. En liten förklaring kan här vara på sin plats.
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
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
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).