Kotisivu » miten » Aloittelijan opas Shell Scripting 2 lle silmukoille

    Aloittelijan opas Shell Scripting 2 lle silmukoille

    Jos haluat rakentaa geek-luottokorttisi, liity meihin toisessa osassa shell-komentosarjojen sarjassa. Meillä on muutamia korjauksia, muutamia parannuksia viime viikon käsikirjoitukseen ja opas ohittamattomien henkilöiden silmukointiin.

    Datecp-skripti tarkistetaan

    Shell-komentosarjan ensimmäisessä osassa teimme komentosarjan, joka kopioi tiedoston varmuuskopiointihakemistoon sen jälkeen, kun päiväys oli lisätty tiedostonimen loppuun.

    Samuel Dionne-Riel huomautti huomautuksissaan, että on paljon parempi tapa käsitellä muuttuvia viittauksia.

    Argumentit on erotettu tilakohtaisesti bash-kuoressa, se merkitsee, kun tuloksena on laajennettu komento. Skriptissasi, cp $ 1 $ 2. $ date_formatted toimii tarkoitetulla tavalla, kun laajennetuilla muuttujilla ei ole välilyöntejä. Jos soitat skriptiin tällä tavalla: datecp "vanha nimi" "uusi nimeni" laajennus johtaa tähän komentoon: cp uusi nimeni vanha nimi.tunnus todellisuudessa on 6 argumenttia.

    Jotta ongelma voitaisiin ratkaista oikein, komentosarjan viimeisen rivin pitäisi olla: cp "$ 1" "$ 2. $ date_formatted"

    Kuten näette, muuttamalla komentosarjan riviä:

    cp -iv $ 1 $ 2. $ date_formatted

    että:

    cp -iv “$ 1” “$ 2”. $ date_formatted

    huolehtii tästä ongelmasta, kun käytät komentosarjaa tiedostoissa, joissa on välilyöntejä nimessä. Samuel huomauttaa myös, että kun kopioit ja liität koodin tästä sivustosta (tai Internetistä), muista korvata oikeat viivat ja lainaukset "typografisesti paremmista" niistä, jotka usein korvaavat ne. Teemme myös enemmän varmistaaksemme, että koodimme on enemmän kopiointi / liitä ystävällinen. ;-)

    Toinen kommentoija, Myles Braithwaite, päätti laajentaa komentosarjaamme niin, että päivämäärä ilmestyy ennen tiedostopääte. Joten sen sijaan

    tastyfile.mp3.07_14_11-12.34.56

    saisimme tämän:

    tastyfile.07_14_11-12.34.56.mp3

    joka päätyy hieman helpommaksi useimmille käyttäjille. Hänen koodinsa on saatavilla GitHub-sivulla. Katsotaanpa, mitä hän käyttää vetääkseen tiedostonimen.

    date_formatted = $ (päiväys +% Y-% m-% d_% H.% M% S)
    file_extension = $ (echo "$ 1" | awk -F. 'print $ NF')
    tiedoston_nimi = $ (basename $ 1. $ file_extension)

    cp -iv $ 1 $ file_name- $ date_formatted. $ file_extension

    Olen muuttanut muotoilua hieman, mutta näet, että Myles julistaa päivämäärätoimintonsa rivillä 1. Rivillä 2 hän kuitenkin käyttää "echo" -komentoa, jossa komentosarjan ensimmäinen argumentti antaa tiedoston nimen. Hän käyttää putkikomentoa ottamaan tuotoksen ja käyttämään sitä seuraavan osan syötteenä. Putken jälkeen Myles kutsuu "awk" -komennon, joka on tehokas kuvion skannausohjelma. Käyttämällä -F-lippua hän kertoo komennolle, että seuraava merkki (välilyönnin jälkeen) määrittelee kentänerottimen. Tässä tapauksessa se on aika.

    Nyt awk näkee tiedoston nimeltä "tastyfile.mp3", joka koostuu kahdesta kentästä: "tastyfile" ja "mp3". Lopuksi hän käyttää

    'print $ NF'

    näytetään viimeinen kenttä. Jos tiedostossa on useita jaksoja - mikä tekee awkista useita kenttiä - se näyttää vain viimeisen, joka on tiedostopääte.

    Rivillä 3 hän luo uuden muuttujan tiedoston nimelle ja käyttää "basename" -komentoa viittaamaan kaikkeen $ 1: een paitsi tiedostopääte. Tämä tehdään käyttämällä perusnimeä ja antamalla sen $ 1 argumenttina, sitten lisäämällä välilyönti ja tiedostopääte. Tiedostotunniste lisätään automaattisesti, koska viiva 2 viittaa muuttujaan

    tastyfile.mp3

    ja muuta se

    tastyfile

    Sitten viimeisessä rivissä Myles kootti komennon, joka tuottaa kaiken oikein. Huomaa, että ei ole viittausta $ 2: een, toinen argumentti komentosarjalle. Tämä erityinen komentosarja kopioi mainitun tiedoston nykyiseen hakemistoon. Suuri työ Samuel ja Myles!

    Käynnistä komentosarjat ja $ PATH

    Mainitsemme myös perusasiat-artikkelissamme, että komentosarjoja ei saa viitata komentoihin oletusarvoisesti. Toisin sanoen, sinun on osoitettava komentosarjan polku, jotta voit suorittaa sen:

    ./ script

    ~ / Bin / script

    Mutta sijoittamalla skriptejäsi ~ / bin /, voit vain kirjoittaa heidän nimensä mistä tahansa, jotta heidät ajetaan.

    Kommentoijat viettivät jonkin aikaa keskustelemaan siitä, miten tämä oikein oli, koska mikään nykyaikainen Linux-distro ei luo kyseistä hakemistoa oletusarvoisesti. Lisäksi kukaan ei lisää sitä $ PATH-muuttujaan oletusarvoisesti, mikä on tarpeen, jotta skriptit voidaan suorittaa kuten komennot. Olin hieman hämmentynyt, koska $ PATH-muuttujan tarkistamisen jälkeen kommentoijat olivat oikeassa, mutta kutsuvat skriptit toimivat edelleen minulle. Selvin, miksi: monet nykyaikaiset Linux-alueet luovat erityisen tiedoston käyttäjän kotikansioon - .profile.

    Tätä tiedostoa lukee bash (ellei .bash_profile ole käyttäjän kotikansiossa) ja alareunassa on osa, joka lisää ~ / bin / kansion $ PATH muuttujaan, jos se on olemassa. Niin, että mysteeri poistetaan. Muiden sarjojen kohdalla jatkan komentosarjojen asettamista ~ / bin / hakemistoon, koska ne ovat käyttäjän komentosarjoja, ja käyttäjien olisi voitava käyttää niitä. Ja näyttää siltä, ​​että meidän ei tarvitse oikeastaan ​​sotkea $ PATH -muuttujan kanssa käsin saadaksemme asiat toimimaan.

    Toistuvat komennot silmukoilla

    Mennään yhteen kaikkein hyödyllisimmistä työkaluista geek-arsenalissa toistuvien tehtävien käsittelemiseksi: silmukat. Tänään keskustelemme "for" -silmukoista.

    For-loopin peruskuva on seuraava:

    muuttujalle LIST; tehdä
    Command1
    command2
    ...
    commandn
    tehty

    VARIABLE voi olla mikä tahansa muuttuja, vaikka useimmiten pieniä kirjaimia ”i” käytetään yleissopimuksessa. LIST on luettelo kohteista; Voit määrittää useita kohteita (erottamalla ne välilyönnillä), osoittamalla ulkoista tekstitiedostoa tai käyttämällä tähtiä (*) merkitsemällä minkä tahansa tiedoston nykyisessä hakemistossa. Listatut komennot on lisätty yleissopimukseen, joten on helpompi nähdä pesiminen - silmukoiden asettaminen silmukoihin (joten voit silmukata silmukkaasi).

    Koska listat käyttävät välilyöntejä erottimina - eli tila merkitsee siirtymistä luettelon seuraavaan kohtaan - tiedostot, joissa on välilyöntejä, eivät ole kovin ystävällisiä. Tällä hetkellä pidetään kiinni tiedostoista ilman välilyöntejä. Aloitetaan yksinkertaisella komentosarjalla, joka näyttää nykyisten hakemistojen tiedostojen nimet. Luo uusi komentosarja ~ / bin / kansioon, jonka otsikko on "loopscript". Jos et muista, miten tämä tehdään (mukaan lukien sen merkitseminen suoritettavaksi ja hash bang hackin lisääminen), katso bash-komentosarjojen perustiedot artikkeli.

    Syötä siinä seuraava koodi:

    i: lle kohdassa 1 erä2 kohta3 kohta4 kohta5 kohta6; tehdä
    echo “$ i”
    tehty

    Kun suoritat komentosarjan, sinun pitäisi vain saada nämä nimikkeet kohteeksi.

    Melko yksinkertainen, eikö? Katsotaanpa mitä tapahtuu, jos muutamme asioita hieman. Muuta komentosarjaa niin, että se sanoo:

    i: lle *; tehdä
    echo “$ i”
    tehty

    Kun suoritat tämän komentosarjan kansiossa, saat luettelon tiedostoista, jotka se sisältää tulostettuna.

    Nyt muutetaan kaiun komento jotain hyödyllistä - eli zip-komentoa. Nimittäin lisäämme tiedostot arkistoon. Ja saatetaan joitakin argumentteja sekaan!

    i: lle $ @; tehdä
    zip-arkisto “$ i”
    tehty

    On jotain uutta! "$ @" On pikakuvake "$ 1 $ 2 $ 3… $ n". Toisin sanoen se on täydellinen luettelo kaikista määritetyistä argumenteista. Katso nyt, mitä tapahtuu, kun suoritan komentosarjan useilla syötetiedostoilla.

    Näet, mitkä tiedostot ovat kansiossa. Juoksin komennon kuudella argumentilla, ja jokainen tiedosto lisättiin arkistoituun arkistoon ”archive.zip”. Helppo, oikea?

    Silmukat ovat melko ihania. Nyt voit suorittaa erätoimintoja tiedostojen luetteloissa. Voit esimerkiksi kopioida kaikki komentosarjan argumentit zip-arkistoon, siirtää alkuperäiset toiseen kansioon ja suojata kopioida automaattisesti zip-tiedoston etätietokoneeseen. Jos asetat avaintiedostoja SSH: lla, sinun ei tarvitse edes syöttää salasanaa, ja voit jopa kertoa komentosarjalle, että se poistaa zip-tiedoston sen lataamisen jälkeen!


    Käyttämällä silmukoita on helppo tehdä joukko toimintoja kaikkiin hakemiston tiedostoihin. Voit pinota monenlaisia ​​käskyjä yhdessä ja käyttää argumentteja hyvin helposti luodaksesi ja lennättävän luettelon, ja tämä on vain jäävuoren kärki.

    Bash-käsikirjoittajat, onko sinulla ehdotuksia? Oletko tehnyt hyödyllisen komentosarjan, joka käyttää silmukoita? Haluatko jakaa ajatuksia sarjasta? Jätä kommentteja ja auta muita komentosarjojen aloittelijoita!