Koduleht » kuidas » Algaja juhend Shelli skriptimiseks 2 silmusele

    Algaja juhend Shelli skriptimiseks 2 silmusele

    Kui soovite oma geekrediiti üles ehitada, liituda meiega meie teise skaneerimissarjaga. Meil on mõned korrektsioonid, paar parandust eelmise nädala skripti jaoks ja juhis, kuidas silmitsi asjatundjate jaoks.

    Datecp Script revisited

    Meie shelliskriptide juhendi esimeses osas tegime skripti, mis kopeeris faili varukataloogi pärast kuupäeva lisamist failinime lõppu.

    Samuel Dionne-Riel märkis kommentaarides, et meie muutuvate viidete käsitlemiseks on palju parem viis.

    Argumendid on tühikukujul eraldatud ruumis, see tähistab, kui tulemuseks on laiendatud käsk ruumi. Teie skriptis, cp $ 1 $ 2. $ date_formatted toimib ettenähtud viisil, kui laiendatud muutujad ei sisalda nendes ruume. Kui helistate skripti sel viisil: datecp "minu vana nimi" "minu uus nimi" laiendamine toob selle käsu: cp minu uus nimi minu vana nimi mis on tegelikult 6 argumenti.

    Selle probleemi nõuetekohaseks käsitlemiseks peaks skripti viimane rida olema: cp "$ 1" "$ 2. $ date_formatted"

    Nagu näete, muudab meie skripti rida:

    cp -iv $ 1 $ 2. $ date_formatted

    kuni:

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

    hoolitseb selle probleemi eest, kui kasutate skripti failides, millel on nime sees tühikud. Samuel juhib tähelepanu ka sellele, et selle saidi (või Interneti üldise) koodi kopeerimisel ja kleepimisel tuleb kindlasti asendada sobivad kriipsud ja tsitaadid "tüpograafiliselt parema" puhul, mis neid sageli asendavad. Teeme ka rohkem, et meie kood oleks rohkem koopia / kleebi sõbralik. ;-)

    Teine kommentaar, Myles Braithwaite, otsustas laiendada oma skripti nii, et kuupäev ilmuks enne faililaiendit. Nii et mitte

    tastyfile.mp3.07_14_11-12.34.56

    me saame selle:

    tastyfile.07_14_11-12.34.56.mp3

    mis on enamiku kasutajate jaoks veidi mugavam. Tema kood on saadaval tema GitHubi lehel. Vaatame, mida ta kasutab failinime tõmbamiseks.

    date_formatted = $ (kuupäev +% Y-% m-% d_% H.% M% S)
    file_extension = $ (echo “$ 1” | awk -F. 'print $ NF')
    file_name = $ (basename $ 1. $ file_extension)

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

    Ma olen natuke muutnud vormindamist, kuid näete, et Myles deklareerib oma kuupäeva funktsiooni reas 1. Reas 2 kasutab ta „echo” käsku, mille esimene argument annab faili nime. Ta kasutab toru käsu selle väljundi võtmiseks ja kasutab seda järgmise osa sisendina. Pärast toru, kutsub Myles käsu „awk”, mis on võimas mustri skaneerimise programm. -F-lipu abil ütleb ta käsku, et järgmine märk (tühiku järel) on see, mis määratleb „väljalõikuri”. Sel juhul on see periood.

    Nüüd näe awk faili nimega “tastyfile.mp3”, mis koosneb kahest väljast: “maitsevfail” ja “mp3”. Lõpuks kasutab ta

    'print $ NF'

    viimase välja kuvamiseks. Juhul, kui teie failil on mitu perioodi - seega muudab awk mitu väljad - kuvab ainult viimane, mis on faili laiend.

    Reas 3 loob ta faili nimele uue muutuja ja kasutab "basename" käsku, et viidata kõike $ 1-le välja arvatud faili laiend. Seda tehakse baasnime abil ja andes selle argumenti $ 1, lisades seejärel tühiku ja faililaiendi. Faililaiendi lisamine toimub automaatselt, sest see viitab joonele 2. Mida see teeb, on võtta

    tastyfile.mp3

    ja lülitage see sisse

    maitsevfail

    Viimasel real koostas Myles käsu, mis väljastab kõik korras. Pange tähele, et skriptile ei ole viidet teisele argumendile. See konkreetne skript kopeerib selle faili teie praegusesse kataloogi. Suur töö Samuel ja Myles!

    Skriptide ja $ PATH käivitamine

    Me mainime ka meie põhiteate artiklis, et skripte ei saa vaikimisi viitena käskudeks nimetada. See tähendab, et peate selle käivitamiseks osutama skripti teele:

    ./ skript

    ~ / bin / skript

    Aga kui skripte paigutate ~ / bin / -i, võid lihtsalt sisestada nende nimed kõikjalt, et neid käivitada.

    Kommenteerijad arutasid mõnda aega selle üle, kuidas see õige oli, sest ükski kaasaegne Linuxi distroo ei loo seda kataloogi vaikimisi. Lisaks sellele ei lisa keegi vaikimisi ka $ PATH muutujat, mis on vajalik skriptide käivitamiseks sarnaselt käskudele. Olin natuke hämmingus, sest pärast minu $ PATH muutuja kontrollimist olid kommentaarid õiged, kuid helistaja skriptid töötasid minu jaoks veel. Ma sain teada, miks: paljud kaasaegsed Linuxi distrosid loovad kasutaja kodukataloogis spetsiaalse faili - .profile.

    Seda faili loeb bash (kui .bash_profile on kasutaja kodukataloogis olemas) ja allosas on osa, mis lisab ~ / bin / kausta $ PATH muutujale, kui see on olemas. Niisiis, see mõistatus on kustutatud. Ülejäänud seeria jaoks panen skripte edasi ~ / bin / kataloogi, sest nad on kasutaja skriptid ja neid peaks saama kasutada kasutajad. Ja tundub, et me ei pea tõepoolest segama $ PATH muutujaga, et asjad toimiksid.

    Korda korduvaid käske silmusega

    Lähme ühte kõige kasulikumatest tööriistadest korduva ülesande käsitlemiseks geek arsenalis: silmused. Täna räägime „for“ silmustest.

    Lingiliini põhiülesanne on järgmine:

    VARIABLE jaoks LIST; teha
    käsk1
    käsk2

    käsk
    tehtud

    VARIABLE võib olla ükskõik milline muutuja, kuigi kõige sagedamini kasutatakse väikeseid “i”. LIST on üksuste loetelu; saate määrata mitu üksust (eraldades need tühikuga), osutada välisele tekstifailile või kasutada tärniga (*) mis tahes faili tähistamist praeguses kataloogis. Loetletud käsud on koondatud kokkuleppega, mistõttu on lihtsam näha pesitsemist - lingid silmusesse (nii et sa võid silmusega silmusega siluda).

    Kuna nimekirjad kasutavad piiritena tühikuid - see tähendab, et ruum tähistab liikumist järgmisesse loendi elemendisse - nimes olevad tühikud ei ole väga sõbralikud. Praeguseks jääme tööle ilma tühikuteta failidega. Alustame lihtsa skriptiga, et kuvada praeguses kataloogis olevate failide nimed. Looge oma ~ / bin / kausta pealkirjaga „loopscript“ uus skript. Kui te ei mäleta, kuidas seda teha (sh märkida, et see on käivitatav ja räsikõva häkkimise lisamine), siis vaadake meie bash-skriptimise põhiteksti artiklit.

    Sisestage selles järgmine kood:

    i jaoks punktis 1 kirje2 kirje3 kirje4 kirje5 kirje6; teha
    kaja “$ i”
    tehtud

    Skripti käivitamisel peaksite saama need nimekirjad ainult väljundiks.

    Päris lihtne, eks? Vaatame, mis juhtub, kui muudame asju natuke. Muutke oma skripti nii, et see ütleb:

    i puhul *; teha
    kaja “$ i”
    tehtud

    Kui käivitate selle skripti kaustas, peaksite saama nimekirja failidest, mida see sisaldab väljundina.

    Nüüd muutkem kaja käsk midagi kasulikumaks - näiteks zip-käsk. Nimelt lisame faile arhiivi. Ja saame segus mõned argumendid!

    i jaoks $ @; teha
    zip-arhiiv “$ i”
    tehtud

    On midagi uut! “$ @” On otsetee „$ 1 $ 2 $ 3… $ n”. Teisisõnu, see on kõigi määratud argumentide täielik nimekiri. Nüüd vaadake, mis juhtub, kui käivitan skripti mitme sisendfailiga.

    Näete, millised failid on minu kaustas. Käisin käsku kuue argumendiga ja iga fail lisati zip-arhiivile „archive.zip”. Lihtne, õige?

    Sest silmad on päris imeline. Nüüd saate teostada partiifunktsioone failide nimekirjades. Näiteks saate kopeerida kõik oma skripti argumendid zipitud arhiivi, teisaldada originaalid teisele kaustale ja turvaliselt kopeerida selle zip-faili kaugarvutisse. Kui seadistate võtmefaile SSH-ga, ei pea te isegi parooli sisestama ja saate isegi skripti kustutada pärast selle üleslaadimist zip-faili!


    Silmusahelate kasutamine muudab kataloogi toimingute tegemise lihtsaks. Saate üksteisega kokku panna mitmesuguseid käske ja kasutada argumente väga kergesti lendude loendi loomiseks ja see on ainult jäämäe tipp.

    Bash scripters, kas teil on ettepanekuid? Kas olete teinud kasuliku skripti, mis kasutab silmuseid? Kas soovite jagada mõtteid seeria kohta? Jäta mõned kommentaarid ja aita teisi skriptide algajaid välja!