Reddit – linux – Wat is de beste manier om bash te leren?

De manier waarop ik een taal heb geleerd, is niet door er een boek over te gaan lezen om het te leren, maar door een doel voor ogen te hebben:

Ik wil X automatiseren.

Ik begin dan het probleem uit te denken, en gebruik dan het internet om de syntaxis te achterhalen die me van A naar B brengt.

Jaren geleden wilde ik bijvoorbeeld de uptime van mijn systeem bijhouden, toen ik net was overgestapt van Windows dat elke 48 uur opnieuw moest worden opgestart en ook omdat ik een grote nerd was. Ik was er een online vriend mee aan het treiteren, dus ik wilde de uptime van mijn systeem hier thuis updaten, op een webpagina die buiten op het Internet gehost werd, op een server in een andere staat.

Hoe doe ik dat?

Wel, allereerst, hoe maak ik een script dat echt draait.

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

Hm, het draait nog steeds niet…

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

Nu, hoe pak ik de uptime? Nou, ik zou het uptime commando uit elkaar kunnen halen, maar een van de functies die ik wilde was het bijhouden van mijn “record uptime.” Linux’s uptime commando geeft uptimes in leesbare vorm weer:

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

Wel, dat is een beetje moeilijk te ontleden als groter of kleiner dan. Kan gedaan worden, maar er moet een eenvoudiger manier zijn. Ik vraag me af waar het “uptime” programma die gegevens vandaan haalt? Een beetje googelen brengt me bij het /proc systeem:

/proc/uptime

Hoe moet ik dat lezen? Er zijn een paar manieren. De manier die ik uit gewoonte gebruikte (en het is waarschijnlijk de verkeerde manier omdat het cat commando hier niet echt voor bedoeld is) is:)

cat /proc/uptime

Wat oplevert:

2780345.41 5546896.19

OK, nu hebben we mooie decimalen die het makkelijker maken om uit te zoeken of het een record uptime is. Maar hoe pak ik dat in een variabele? Ik heb nog wat meer online gelezen over backquotes:

UPTIME=`cat /proc/uptime`

Cool, nu heb ik het in een variabele. Mentale notitie, je kunt allerlei interessante dingen in variabelen lezen op deze manier. Moet dat onthouden in de toekomst. GELEERD. Ook, wat is dat /proc spul allemaal over? Ooh, allerlei goede dingen daar zoals:

cat /proc/cpuinfo

OK dus nu heb ik dit grote decimale getal. Hoe zet ik dat om in dagen, zodat ik uptimes heb zoals “23.8 dagen”? Ook cat /proc/cpuinfo geeft twee getallen. Welke wil ik hebben? En hoe trek ik dat uit elkaar zodat ik alleen dat nummer heb? Ik heb nog wat verder gelezen. Nu zijn er een paar manieren om een string uit elkaar te trekken, maar het eerste wat ik tegenkom is het commando cut. Hoe gebruik ik dat met een string? Ik lees een artikel over piping en redirection. Ik zie dat de twee getallen gescheiden worden door een spatie als scheidingsteken, dus:

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

Cool. Moet dat onthouden. Ik kan interessante dingen doen met die pijp. Ik berg dat mentaal op, samen met het knip-commando, dat een van de nuttigste command line tools zal zijn die ik ben tegengekomen.

Nu, hoe zet ik dat om in dagen…hm, teleurstellend, bash heeft shitty wiskunde ondersteuning. Hm, dit artikel heeft het over bc. Een beetje experimenteren en:

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

Dus bc is het programma dat gebruikt wordt om berekeningen te maken. Dat zal ik moeten onthouden. Ik leerde over backquotes en de pipe in eerdere stappen, dus het was duidelijk hoe dat hier te gebruiken.

Nu hoe echo ik dit uit naar een tekstbestand dat ik kan gebruiken als een PHP include op de website (PHP leerde veel op dezelfde manier)?

Ah, redirection!

echo $uptime > ./uptime.txt

Enzovoort. Als ik naar mijn oude scripts kijk (deze inbegrepen), is de codering inefficiĆ«nt en niet noodzakelijk hoe ik het nu zou doen. Maar als ik dit proces door de jaren heen volg, verbeteren mijn vaardigheden en kennis, en door mezelf in de nesten te werken door slechte praktijken, leer ik hoe ik dingen niet moet doen. Mijn methodes verbeteren zodat scripts beter onderhoudbaar worden — niet door in een klaslokaal te zitten of een boek te lezen, maar door mezelf te verneuken en ervan te leren.

NOOT: Ik ben geen professionele ontwikkelaar. Ik schrijf scripts voornamelijk voor mijn eigen (hobbyistische) doeleinden. Ik weet dat mensen met een informatica achtergrond bezwaren kunnen hebben tegen deze manier van leren, maar voor mij heeft het tot nu toe goed gewerkt. En het is erg leuk, want in plaats van een soort van alledaagse oefening van lezen en uit het hoofd leren, krijg ik er iets “uit” terwijl ik bezig ben — bruikbare scripts.

Tussen haakjes — bookmark dit als je het nog niet hebt. Het is fantastisch:

Advanced Bash Scripting Guide — het meeste van wat ik weet over bash komt hier vandaan.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.