scripts_grundkurs/Labb6/laborationsrapport.md

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).