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!