Måden jeg har lært et sprog på er ikke at sætte mig ned og læse en bog om det bare for at lære det, men at have et formål for øje:
Jeg vil automatisere X.
Jeg begynder så at tænke problemet ud, og bruger så internettet til at finde ud af syntaks for at få mig fra A til B.
For eksempel ønskede jeg for år tilbage at spore mine systemopdateringer, da jeg lige var flyttet fra Windows, som skulle genstartes hver 48. time, og også fordi jeg var en stor nørd. Jeg hånede en online ven med det, så jeg ville opdatere oppetiden på mit system herhjemme, på en webside som blev hostet ude på internettet, på en server i en anden stat.
Hvordan gør jeg det?
Jamen, først og fremmest, hvordan begynder jeg at lave et script, som rent faktisk vil køre.
#!/bin/bash <- Oh, specifies the script interpreter. LEARNED.
Hm, det vil stadig ikke køre…
# chmod +x <- Oh, needs execute bit set. LEARNED.
Nu, hvordan får jeg fat i oppetiden? Tja, jeg kunne trække uptime-kommandoen fra hinanden, men en af de funktioner, jeg ønskede, var at spore min “record uptime”. Linux’ uptime-kommando viser oppetider i menneskeligt læsbar form:
13:23:54 up 32 days, 4:19
Jamen, det er lidt groft at analysere som større end eller mindre end. Kan lade sig gøre, men der må være en enklere måde. Gad vide hvor “uptime”-programmet henter disse data fra? Lidt googling introducerer mig til /proc-systemet:
/proc/uptime
Hvordan læser jeg det? Der er et par måder. Den måde jeg brugte af vane (og det er sikkert den forkerte måde, da cat-kommandoen ikke rigtig er beregnet til dette er:)
cat /proc/uptime
Hvilket returnerer:
2780345.41 5546896.19
OK, nu har vi flotte decimaler, som gør det nemmere at finde ud af, om det er en record uptime. Men hvordan får jeg fat i det i en variabel? Jeg læste lidt mere på nettet om backquotes:
UPTIME=`cat /proc/uptime`
Cool, nu har jeg det i en variabel. Mental note, du kan læse alle mulige interessante ting ind i variabler på denne måde. Det må jeg huske i fremtiden. LÆRET. Desuden, hvad er det der /proc-ting om? Ooh, alle mulige gode ting derinde som:
cat /proc/cpuinfo
OK så nu har jeg dette store decimaltal. Hvordan konverterer jeg det til dage, så jeg har oppetider som “23,8 dage”? Også cat /proc/cpuinfo returnerer to tal. Hvilket vil jeg have? Og hvordan trækker jeg det fra hinanden, så jeg kun har dette tal? Jeg har læst lidt mere. Nu er der et par måder at trække en streng fra hinanden på, men det første, jeg støder på, er cut-kommandoen. Hvordan bruger jeg den med en streng? Jeg læste en artikel om piping og redirection. Jeg kan se, at de to tal er adskilt af et mellemrum som afgrænser, så:
NUMBERIWANT=`echo ${uptime} | cut -d " " -f 1`
Cool. Det må jeg huske. Jeg kan lave interessante ting med den pipe. Jeg arkiverer det mentalt, sammen med cut-kommandoen, som vil være et af de mest nyttige kommandolinjeværktøjer, jeg er stødt på.
Nu, hvordan jeg skal omsætte det til dage…hm, skuffende, bash har lorteunderstøttelse af matematik. Hm, denne artikel taler om bc. Lidt eksperimentering og:
uptime=`echo "scale=2; $uptime/86400" | bc`
Så bc er det program, der bruges til at lave beregninger. Det bliver jeg nødt til at huske. Jeg lærte om backquotes og pipe i tidligere trin, så det var oplagt at bruge det her.
Hvordan ekkoer jeg nu dette ud til en tekstfil, som jeg kan bruge som en PHP include på hjemmesiden (PHP lærte jeg meget på samme måde)?
Ah, redirection!
echo $uptime > ./uptime.txt
Og så videre. Hvis jeg kigger på mine gamle scripts (dette inkluderet), så er kodningen ineffektiv og ikke nødvendigvis sådan jeg ville gøre det nu. Men efterhånden som jeg følger denne proces gennem årene, forbedres mine færdigheder og mit vidensæt, og ved at male mig selv ind i hjørner ved dårlig praksis lærer jeg, hvordan jeg ikke skal gøre tingene. Mine metoder forbedres, så scripts bliver mere vedligeholdelsesvenlige – ikke ved at sidde i et klasseværelse eller læse en bog, men ved at tage røven på mig selv og lære af det.
NOTAT: Jeg er ikke en professionel udvikler. Jeg skriver primært scripts til mine egne (hobbymæssige) formål. Jeg ved godt, at folk med datalogisk baggrund kan have indvendinger mod denne læringsmetode, men indtil videre har den fungeret godt for mig. Og det er meget sjovt, for i stedet for bare at være en slags hverdagsøvelse med læsning og udenadslære, får jeg noget “ud af det” efterhånden som jeg gør det – nyttige scripts.
Forresten – bookmarker dette, hvis du ikke har gjort det. Det er fantastisk:
Advanced Bash Scripting Guide — det meste af det, jeg ved om bash, er kommet herfra.