Bashin silmukoiden lukeminen ja lukemisen aikana

Kuinka luoda silmukka eli suunnitella ohjelma toistamaan työtä puolestasi

Silmukka on yksi perustavanlaatuisimmista ja tehokkaimmista laskennan rakenteista, koska sen avulla voimme toistaa joukon komentoja niin monta kertaa kuin haluamme luettelon valitsemistamme kohteista. Suuri osa laskennallisesta ajattelusta sisältää yhden tehtävän ottamisen ja ratkaisemisen tavalla, jota voidaan käyttää toistuvasti kaikkiin muihin vastaaviin tehtäviin, ja for loop -sarjan avulla saamme tietokoneen tekemään tämän toistuvan työn:

Toisin kuin suurin osa koodista, jonka olemme tähän mennessä kirjoittaneet interaktiivisessa kehotteessa, for-loop ei toteudu heti, kun osumme Enteriin:

Voimme kirjoittaa niin monta komentoa kuin haluamme, lohkoon avainsanojen do ja done väliin. :

Vain, kunnes saavutamme done ja painamme Enter, for-loop tekee työnsä.

Tämä on pohjimmiltaan erilainen kuin rivi riviltä komento ja vastaus, jonka olemme tähän mennessä kokeneet kehotteessa. Ja se ennakoi, miten ohjelmoimme edelleen: vähemmän painotetaan komentojen suorittamista jokainen rivi ja enemmän huomiota ohjelman toiminnallisuuden suunnitteluun ja sen suorittamiseen myöhemmin.

Perussyntaksi

for -silmukoiden syntaksit voivat olla hämmentäviä, joten tässä on joitain perusesimerkkejä ymmärtämisen valmistelemiseksi / päivittämiseksi:

Tässä on monimutkaisempi versio, joka käyttää muuttujia:

Komennon korvaamista voidaan käyttää luomaan kohteet, jotka for -silmukka iteroi:

Jos sinun on luettava luettelo rivistä tiedosto, ja ovat täysin varmoja siitä, että mikään riveistä ei sisällä välilyöntiä:

Read-while -silmukka on muunnelma yllä olevista, mutta on turvallisempi tiedostojen rivien lukemiselle:

Perussäännön luominen silmukalle

Aloitetaan alusta alusta hyvin hyvin minimaalinen for -silmukka ja rakensi sen sitten monimutkaisemmaksi, jotta voimme ymmärtää niiden tarkoituksen.

Yksinkertaisin silmukka

Tämä on suunnilleen yhtä yksinkertaista kuten voit tehdä for for -silmukan:

Näytti siltä melko arvottomalta? Kyllä sen olisi pitänyt. Kirjoitin neljä riviä koodia tehdäkseni sen, mikä tarvitaan yhdellä rivillä, echo "Hi".

Lisää elementtejä kokoelmassa

Se ”s on vaikea sanoa, mutta” silmukka ”suoritti. Se vain suoritettiin kerran. OK, niin miten voimme saada sen suorittamaan useamman kuin yhden kerran? Lisää lisää (välilyönnillä erotettuja) elementtejä in avainsana. Lisää ”s” vielä neljä 1 ”s:

OK, ei kovin jännittävä, mutta ohjelma näytti ehdottomasti ainakin silmukan: neljä 1 ”johti neljän echo -komennon suorittamiseen.

Mitä tapahtuu, kun nämä neljä 1 ”korvataan eri numeroilla? Ja ehkä pari sanaa?

Ja … ei mitään. Joten silmukka ei tee automaattisesti mitään erityistä sille antamallemme arvokokoelmalle. Ei vielä.

Katso silmukamuuttujaa

Katsotaanpa ”in -avainsanan vasemmalta puolelta ja x. Mikä on sen merkitys x? Pienillä kirjaimilla x ei ole toistaiseksi havaitun avainsanan tai komennon nimeä (ja sen suorittaminen yksin kehotteessa heittää virheen). Joten ehkä se on muuttuja? Yritetään viitata siihen echo -lausekkeessa:

Bingo. Tämä on melkein for -silmukan perustoiminta: – Hanki kokoelma esineitä / arvoja (Q Zebra 999 Smithsonian) – Siirrä ne for -silmukkarakenne – Käytä silmukkamuuttujaa (x) paikkamerkkinä ja kirjoita komentoja do / done -lohko. – Kun silmukka suoritetaan, silmukan muuttuja x ottaa jokaisen kohteen arvon luettelo – Q, Zebra, 999, Smithsonian, – ja komentojen lohko do ja done välillä suoritetaan. Tämä jakso toistuu kerran jokaiselle luettelon kohteelle.

Lohko do / done voi sisältää minkä tahansa sarjan komentoja, jopa toinen for -loop:

Silmukat silmukoiden sisällä on yleinen rakenne ohjelmoinnissa.Enimmäkseen yritän välttää sellaisten logiikoihin liittyvien ongelmien määrittämistä, jotka voivat olla hankalia irrottaa virheenkorjauksen aikana.

Lue tiedosto rivi riviltä, luotettavasti, kun luku on

Koska cat tulostaa tiedoston rivi riviltä, seuraava silmukalle vaikuttaa järkevältä:

Komennon korvaaminen saa kuitenkin cat jakamaan sanat välilyönnillä. Jos list-of-dirs.txt sisältää seuraava:

for -silmukan lähtö on seuraava:

Lukemissilmukka säilyttää rivin sanat:

Voimme myös lähettää tuloksen komennon liittämällä se osiin <( ja ):

Putket ja silmukat

Jos tulet muilta kieliltä, datavirrat saattavat olla sinulle tuntemattomia . Ainakin he ovat minulle, koska heidän kanssaan työskentelyn syntaksit ovat paljon suorempia ja suoraviivaisempia Bashissa kuin Ruby tai Pythonissa.

Jos kuitenkin olet uusi ohjelmoinnissa millä tahansa kielellä, mitä voisi On myös epäselvää, miten datavirtojen käyttö on erilaista kuin silmukoiden kanssa.

Esimerkiksi seuraava katkelma:

– tuottaa saman ulostulon kuin tämä silmukka:

Ja mielenterveydestäsi riippuen näyttää siltä, että kummassakin esimerkissä jokainen sana, esim. hello, world, siirretään käännösprosessin läpi (kautta tr) ja sitten kaikutaan.

Putket ja suodattimet

Pääsemättä käsittelemään Unix-järjestelmän perusteita, joissa putki toimii pohjimmiltaan eri tavalla kuin tässä oleva silmukka,

Ohjelmat, jotka välittävät stdinistä ja stdoutista, voidaan yleensä järjestää suodattimina, joihin tietovirta menee ohjelmaan ja tulee esiin eri muodossa:

Ajattele silmukan käyttöä tehtävissä, jotka ovat muutakin kuin vain tiedon muuntamista suodattimesta suodattimeen. Mikä voisi olla esimerkiksi tehtävä? Annettu URL-osoitteiden luettelo, lataa kukin ja lähetä ladatut tiedot sähköpostitse mukautetulla rungolla ja aiheella:

Tietolähde, kukin URL-osoite urls.txt, ei todellakaan suodata tähän. Sen sijaan jokaiselle URL-osoitteelle tehdään monivaiheinen tehtävä.

Luetaan samalla kun luetaan

Silti silmukka voidaan itse toteuttaa vain yhdeksi suodattimeksi suodattimien joukossa. Ota tämä lukemissilmukan muunnos, jossa echo | grep -tulos johdetaan riveittäin riviin while -silmukka, joka tulostaa stdout-tiedostoon käyttämällä echo, joka ohjataan tiedostoon some.txt:

Tämä ei ole rakenne, jota joudut ehkä tekemään usein, jos ollenkaan, mutta toivottavasti se vahvistaa putkien käyttöä Unixissa.

Vähemmän vuorovaikutteista ohjelmointia

for -silmukoiden ja vastaavien rakenteiden usein käytetty käyttö tarkoittaa, että ”siirrymme yli hyvien ol-päivien ohitse kirjoittamalla yhden c-rivin komentoja ja sen suorittaminen heti sen jälkeen, kun olemme painaneet Enter. Riippumatta siitä kuinka monta komentoa pakkaamme for -silmukkaan, mitään ei tapahdu, ennen kuin osumme avainsanaan done.

Kirjoita kerran. Silitä se sitten

Kun rivi riviltä vuorovaikutus kuoren kanssa menetetään, menetämme interaktiivisen kehotteen tärkeimmän edun: välitön palaute. Ja meillä on edelleen kaikki haitat: jos teemme kirjoitusvirheen aikaisemmin komentojen lohkossa do ja done välillä, meidän on aloitettava kaikkialla.

Joten näin lievennämme sitä:

Testaa koodisi yksi tapaus kerrallaan

Yksi suurimmista virheistä, joita aloittelijat tekevät for -silmukat ovat sitä mieltä, että for -silmukka ratkaisee heidän ongelmansa välittömästi. Jos heidän on siis ladattava 10000 URL-osoitetta, mutta he vain yhden URL-osoitteen lataaminen ei onnistu, heidän mielestään virheellisten komentojen asettaminen for -silmukkaan on askel oikeaan suuntaan.

Sen lisäksi, että se on pohjimmiltaan for -silmukan väärinkäsitys, käytännön ongelma on, että suoritat nyt rikki koodiasi 10000 kertaa, mikä tarkoittaa, että sinun on odotettava 10000 kertaa niin kauan selvittääksesi, että koodisi on, valitettavasti, edelleen rikki.

Joten teeskentele, ettet ole koskaan kuullut for silmukat. Teeskennä, että sinun on ladattava kaikki 10000 URL-osoitetta yksi komento kerrallaan. Voitko kirjoittaa komennon tehdä se ensimmäiselle URL-osoitteelle. Entä toinen? Kun olet kohtuullisen varma siitä, että pieniä syntaksivirheitä ei kompasteta, on aika miettiä, kuinka löytää yleinen malli 9997 muulle URL-osoitteelle.

Kirjoita komentosarjoja

Interaktiivinen komentorivi on loistava.Oli hauska aloittaa, ja se on hauskaa koko tietojenkäsittelyurasi ajan. Mutta kun edessäsi on iso tehtävä, johon kuuluu yli kymmenen riviä koodia, on aika laittaa koodi shell-komentosarja. Älä luota erehtyviin ihmissormisi kirjoittamaan koodin virheettömästi uudelleen.

Käytä silmukoita ja tallenna ne kuorina nanolla komentosarjat. Pidempien tiedostojen kohdalla työskentelen tietokoneeni tekstieditorissa (Sublime Text) ja lähetän sitten palvelimelle.

Harjoittele verkkokaapimalla

Vain maadoittaaksesi for-silmukan syntaksia ja toimintaa, tässä on ajatusprosessi rutiininomaisen tehtävän muuttamisesta silmukaksi:

Numeroille 1-10 lataa Wikipedia-merkintä jokaiselle numerolle curl-toiminnolla ja tallenna se tiedostoon nimeltä ”wiki-number-(whatever the number is).html

Vanhanaikainen tapa

Vain 10 URL-osoitteella voisimme asettaa pari muuttujaa ja sitten kopioida ja liittää curl-komennon 10 kertaa tekemällä muutoksia kullekin riville:

Ja arvaa mitä? Se toimii. 10 URL-osoitteen kohdalla se ei ole huono ratkaisu, ja se on huomattavasti nopeampi kuin tekemällä se vanhanaikaisella tavalla (tekemällä se selaimestasi)

Toiston vähentäminen

Jopa ajattelematta silmukkaa, voimme silti vähentää toistoa muuttujien avulla: perus-URL-osoite, ja perus-tiedostonimi eivät koskaan muutu, joten antakaamme näiden arvojen muuttujille joita voidaan käyttää uudelleen:

for-loop -sovelluksen käyttäminen

Tässä vaiheessa olemme yksinkertaistaneet mallia niin pitkälle, että voimme nähdä, kuinka vähän muutoksia tapahtuu jokaisessa erillisessä tehtävässä. Kun olemme oppineet for -loopista, voimme käyttää sitä ajattelematta paljon (lisäämme myös unikomennon, jotta voimme pysähtyä verkkopyyntöjen välillä)

Luo luettelo

Useimmissa tilanteissa for-loopin luominen on helppoa; se on luettelon luominen, joka voi olla kovaa työtä. Entä jos haluaisimme kerätä sivut numeroille 1–100? Se on paljon kirjoittamista.

Mutta jos annamme laiskuutemme sanella. ajattelemme, voimme kuvitella, että laskeminen x: stä y tuntuu luonnostaan laskennalliselta tehtävältä. Ja se on, ja Unixilla on seq -apuohjelma tähän:

Luettelon luominen ei-numeroista iterointia varten

Monet toistuvat tehtävät Eivät ole niin yksinkertaisia kuin laskeminen x: stä y: hen, joten ongelmaksi tulee kuinka luoda epälineaarinen luettelo tuotteista? Tämä on pohjimmiltaan mitä tiedonkeruun ja hallinnan taiteet tekevät. Tehkäämme sitten yksinkertainen skenaario itsemme:

Kymmenelle kymmenen kirjaimen (tai useammasta) sanasta, jotka näkyvät ainakin kerran otsikossa nykyisellä NYTimes.com-etusivulla, hae sanan Wikisanakirja -sivu

Jaamme tämän tehtävän kahteen osaan:

  1. Hae kymmenen luettelo 10 + -kirje sanat nytimes.com-otsikoista
  2. välitä nuo sanat for-loopille

Vaihe 1: Käytä pup-apuohjelmaa (tai komentorivin HTML-jäsennintä valinta):

Vaihe 2 (olettaen, että muuttuja words välitetään):

Katso Softwa re Carpentryn erinomainen opas Bashin silmukoille

Leave a Reply

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *