Reddit – linux – Vilket är det bästa sättet att lära sig bash?

Sättet jag har lärt mig ett språk på är inte att sätta mig ner och läsa en bok om det bara för att lära mig det, utan att ha ett syfte i åtanke:

Jag vill automatisera X.

Jag börjar då tänka ut problemet och använder sedan Internet för att ta reda på syntaxen för att ta mig från A till B.

För flera år sedan ville jag till exempel spåra mina systemuppdateringar, då jag precis hade flyttat från Windows som måste startas om var 48:e timme och även för att jag var en stor nörd. Jag hånade en vän på nätet med det, så jag ville uppdatera drifttiden för mitt system här hemma, på en webbsida som låg ute på Internet, på en server i en annan stat.

Hur gör man detta?

Nja, först och främst, hur börjar jag göra ett skript som faktiskt kommer att köras.

#!/bin/bash <- Oh, specifies the script interpreter. LEARNED.

Hm, det kommer fortfarande inte att köras…

# chmod +x <- Oh, needs execute bit set. LEARNED.

Nu, hur tar jag fram uptime? Tja, jag skulle kunna plocka isär uptime-kommandot, men en av de funktioner jag ville ha var att spåra min ”record uptime”. Linux upptidskommando visar upptid i mänskligt läsbar form:

13:23:54 up 32 days, 4:19

Nja, det är lite grovt att tolka som större än eller mindre än. Kan göras men det måste finnas ett enklare sätt. Jag undrar varifrån programmet ”uptime” hämtar dessa data? Lite googlande introducerar mig till /proc-systemet:

/proc/uptime

Hur ska jag läsa det? Det finns några olika sätt. Det sätt jag använde av vana (och det är förmodligen fel sätt eftersom cat-kommandot inte riktigt är avsett för detta är:)

cat /proc/uptime

Vilket returnerar:

2780345.41 5546896.19

OK, nu har vi trevliga decimaler som gör det lättare att räkna ut om det är ett rekord i upptid. Men hur tar jag tag i det i en variabel? Jag läste lite mer på nätet om backquotes:

UPTIME=`cat /proc/uptime`

Cool, nu har jag det i en variabel. Mental notis, du kan läsa in alla möjliga intressanta saker i variabler på det här sättet. Måste komma ihåg det i framtiden. LÄRD. Dessutom, vad är det där med /proc för något? Ooh, alla möjliga bra saker där som:

cat /proc/cpuinfo

OK så nu har jag ett stort decimaltal. Hur omvandlar jag det till dagar, så att jag kan ha upptider som ”23,8 dagar”? Dessutom returnerar cat /proc/cpuinfo två siffror. Vilket vill jag ha? Och hur tar jag isär det så att jag bara har det numret? Jag har läst lite mer. Det finns några olika sätt att dela upp en sträng, men det första jag stöter på är kommandot cut. Hur använder jag det med en sträng? Jag läser en artikel om piping och omdirigering. Jag ser att de två siffrorna separeras med ett mellanslag som avgränsare, så:

NUMBERIWANT=`echo ${uptime} | cut -d " " -f 1`

Cool. Måste komma ihåg det. Jag kan göra intressanta saker med det röret. Jag arkiverar det mentalt, tillsammans med kommandot cut, som kommer att bli ett av de mest användbara kommandoradsverktygen jag stött på.

Nu, hur ska jag göra det till dagar…hm, en besvikelse, bash har ett uselt stöd för matematik. Hm, den här artikeln talar om bc. Lite experimenterande och:

uptime=`echo "scale=2; $uptime/86400" | bc`

Så bc är programmet som används för att göra beräkningar. Det måste jag komma ihåg. Jag lärde mig om backquotes och pipe i tidigare steg, så det var uppenbart hur jag skulle använda det här.

Nu hur ekar jag ut detta till en textfil som jag kan använda som en PHP-inkludering på webbplatsen (PHP lärde sig ungefär på samma sätt)?

Ah, redirection!

echo $uptime > ./uptime.txt

Och så vidare. Om jag tittar på mina gamla skript (det här inkluderat) är kodningen ineffektiv och inte nödvändigtvis så som jag skulle göra det nu. Men när jag följer den här processen under årens lopp förbättras mina färdigheter och min kunskapsuppsättning, och genom att måla in mig själv i ett hörn genom dåliga metoder lär jag mig hur man inte ska göra saker och ting. Mina metoder förbättras så att skript blir mer underhållbara – inte genom att sitta i ett klassrum eller läsa en bok utan genom att göra bort mig själv och lära mig av det.

NOTAT: Jag är ingen professionell utvecklare. Jag skriver skript huvudsakligen för mina egna (hobbymässiga) syften. Jag vet att personer med datavetenskaplig bakgrund kan ha invändningar mot denna inlärningsmetod, men den har hittills fungerat bra för mig. Och det är mycket roligt eftersom det inte bara är en slags vardaglig övning i att läsa och memorera, utan jag får något ”ut av det” allteftersom – användbara skript.

Förresten – lägg det här som ett bokmärke om du inte redan har gjort det. Den är fantastisk:

Advanced Bash Scripting Guide — det mesta av det jag vet om bash har kommit härifrån.

Lämna ett svar

Din e-postadress kommer inte publiceras.