Reddit – linux – Mikä on paras tapa oppia bash?

Tapa, jolla olen oppinut mitä tahansa kieltä, ei ole se, että istun alas ja luen siitä kirjan vain oppiakseni sen, vaan että minulla on tarkoitus mielessä:

Haluan automatisoida X:n.

Aloitan sitten miettimään ongelmaa ja käytän sitten internetiä selvittääkseni syntaksin, jolla pääsen A:sta B:hen.

Vuosia sitten halusin esimerkiksi seurata järjestelmäni käyttöaikoja, kun olin juuri siirtynyt Windowsista, joka piti käynnistää uudelleen 48 tunnin välein, ja myös siksi, että olin suuri nörtti. Pilkkasin erästä nettikaveria sillä, joten halusin päivittää järjestelmäni uptime-ajan täällä kotona verkkosivulle, jota isännöitiin internetissä, toisessa osavaltiossa sijaitsevalla palvelimella.

Miten tämä tehdään?

Noh, ensinnäkin, miten alan tehdä skriptiä, joka oikeasti toimii.

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

Hm, ei vieläkään toimi…

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

Nyt, miten napata uptime? No, voisin vetää uptime-komennon erilleen, mutta yksi haluamistani ominaisuuksista oli seurata ”record uptime”. Linuxin uptime-komento näyttää uptime-ajat ihmiselle luettavassa muodossa:

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

Noh, tuota on hieman hankala jäsentää suuremmaksi tai pienemmäksi kuin. Voidaan tehdä, mutta täytyy olla yksinkertaisempi tapa. Mistäköhän ”uptime”-ohjelma ottaa nuo tiedot? Pieni googletus tutustuttaa minut /proc-systeemiin:

/proc/uptime

Miten tuota luen? On olemassa muutama tapa. Tottumuksesta käyttämäni tapa (ja se on luultavasti väärä tapa, koska cat-komentoa ei ole tarkoitettu tähän) on:)

cat /proc/uptime

Joka palauttaa:

2780345.41 5546896.19

OK, nyt meillä on mukavat desimaaliluvut, jotka helpottavat sen selvittämistä, onko kyseessä ennätys uptime. Mutta miten nappaan sen muuttujaan? Luin netistä lisää takaviitteistä:

UPTIME=`cat /proc/uptime`

Cool, nyt minulla on se muuttujassa. Mentaalinen huomautus, voit lukea kaikenlaista mielenkiintoista tavaraa muuttujiin tällä tavalla. Täytyy muistaa se jatkossa. OPITTU. Lisäksi, mitä tuo /proc-juttu tarkoittaa? Siellä on kaikenlaista hyvää, kuten:

cat /proc/cpuinfo

Okei, nyt minulla on tämä iso desimaaliluku. Miten muunnan sen päiviksi, jotta saisin päivitysaikoja kuten ”23.8 päivää”? Myös cat /proc/cpuinfo palauttaa kaksi numeroa. Kumman haluan? Ja miten erotan ne toisistaan niin, että saan vain tuon numeron? Luin hieman lisää. On olemassa muutamia tapoja erottaa merkkijono toisistaan, mutta ensimmäinen tapa, johon törmäsin, on cut-komento. Miten käytän sitä merkkijonon kanssa? Luin artikkelin putkistosta ja uudelleenohjauksesta. Näen, että kaksi numeroa erotetaan toisistaan välilyönnillä erottimena, joten:

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

Cool. Täytyy muistaa se. Voin tehdä mielenkiintoisia asioita tuolla putkella. Arkistoin tuon mentaalisesti, yhdessä cut-komennon kanssa, joka tulee olemaan yksi hyödyllisimmistä komentorivityökaluista, joihin olen törmännyt.

Nyt, miten muuttaa tuo päiviksi…hm, pettymys, bashissa on paska matematiikkatuki. Hm, tässä artikkelissa puhutaan bc:stä. Vähän kokeilua ja:

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

Bc on siis ohjelma, jolla tehdään laskentaa. Täytyypä muistaa tuo. Opin takaviitteistä ja putkesta aiemmissa vaiheissa, joten oli itsestään selvää, miten niitä käytetään tässä.

Miten nyt kaikuin tämän ulos tekstitiedostoon, jota voin käyttää PHP:n include-tiedostona verkkosivulla (PHP:n oppi paljolti samalla tavalla)?

Ah, uudelleenohjaus!

echo $uptime > ./uptime.txt

Ja niin edelleen. Jos katson vanhoja skriptejäni (tämä mukaanlukien), koodaus on tehotonta eikä välttämättä niin kuin tekisin sen nyt. Mutta kun seuraan tätä prosessia vuosien mittaan, taitoni ja tietämykseni paranevat, ja maalaamalla itseni nurkkaan huonoilla käytännöillä opin, miten asioita ei pidä tehdä. Menetelmäni paranevat niin, että skriptit ovat helpommin ylläpidettävissä – ei istumalla luokkahuoneessa tai lukemalla kirjaa, vaan pilaamalla itseni ja oppimalla siitä.

Huomautus: En ole ammattimainen kehittäjä. Kirjoitan skriptejä lähinnä omia (harrastus)tarkoituksiani varten. Tiedän, että tietotekniikkataustaisilla ihmisillä voi olla vastalauseita tätä oppimismenetelmää kohtaan, mutta minulle se on toistaiseksi toiminut hyvin. Ja se on hauskaa, koska sen sijaan, että se olisi vain jonkinlainen arkipäiväinen luku- ja ulkoa opetteluharjoitus, saan samalla jotain ”irti” — hyödyllisiä skriptejä.

Muuten — laita tämä kirjanmerkkeihin, jos et vielä ole. Se on fantastinen:

Advanced Bash Scripting Guide — suurin osa siitä mitä tiedän bashista on tullut täältä.

Vastaa

Sähköpostiosoitettasi ei julkaista.