Pagrindinis » kaip » Pradedančiųjų vadovas „Shell Scripting 2“, skirtas kilpoms

    Pradedančiųjų vadovas „Shell Scripting 2“, skirtas kilpoms

    Jei norite sukurti savo geek kreditą, prisijunkite prie mūsų antroji įmoka mūsų korpuso scenarijų serijoje. Mes turime keletą pataisymų, keletą patobulinimų praėjusios savaitės scenarijui ir gidą, skirtą netinkamiems.

    Pakeistas duomenų skripto scenarijus

    Pirmojoje „Shell Scripting Guide“ versijoje mes sukūrėme scenarijų, nukopijavusį failą į atsarginį katalogą, pridėję datą prie failo pavadinimo pabaigos.

    Samuel Dionne-Riel pastabose nurodė, kad yra daug geresnis būdas tvarkyti mūsų kintamas nuorodas.

    Argumentai yra atskirtos tarpas „bash“ korpuse, jis bus pažymėtas, kai atsiradusioje išplėstoje komandoje yra tarpas. Jūsų scenarijuje, cp $ 1 $ 2. $ date_formatted veiks taip, kaip numatyta, jei išplėstiniai kintamieji jose nėra tarpų. Jei taip skambinate į scenarijų: datecp "mano senas vardas" "mano naujas pavadinimas" plėtra sukels šią komandą: cp mano naujas pavadinimas mano senas pavadinimas._datos kurie iš tikrųjų turi 6 argumentus.

    Norėdami tinkamai išspręsti šią problemą, paskutinė scenarijaus eilutė turėtų būti: „$ 1“ „$ 2. $ date_formatted“

    Kaip matote, keisdami scenarijaus eilutę iš:

    cp -iv $ 1 $ 2. $ date_formatted

    į:

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

    rūpinsis šia problema, kai naudojate scenarijų failuose, kuriuose yra tarpų tarp pavadinimų. Samuelis taip pat nurodo, kad kopijuojant ir įklijuojant kodą iš šios svetainės (arba interneto), būtinai pakeiskite tinkamas brūkšnelius ir kabutes „tipografiškai geresniems“, kurie dažnai juos pakeičia. Taip pat darysime daugiau, kad įsitikintume, jog mūsų kodas yra labiau kopijuojamas / įklijuojamas. ;-)

    Kitas komentatorius Myles Braithwaite nusprendė išplėsti savo scenarijų, kad data būtų rodoma prieš failo plėtinį. Taigi vietoj

    tastyfile.mp3.07_14_11-12.34.56

    mes tai galėtume gauti:

    tastyfile.07_14_11-12.34.56.mp3

    kuris daugeliui vartotojų yra šiek tiek patogesnis. Jo kodas pateikiamas jo „GitHub“ puslapyje. Pažvelkime į tai, ką jis naudoja, kad išskirtų failo pavadinimą.

    date_formatted = $ (data +% Y-% m-% d_% H.% M% S)
    file_extension = $ (echo „$ 1“ | awk -F. „print $ NF“)
    file_name = $ (bazinis vardas $ 1. $ file_extension)

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

    Aš šiek tiek pakeisiu formatavimą, bet jūs matote, kad Myles paskelbia savo datos funkciją 1 eilutėje. Tačiau 2 eilutėje jis naudoja „echo“ komandą su pirmuoju scenarijaus argumentu failo pavadinimui. Jis naudoja vamzdžio komandą, kad pasiektų tą išėjimą ir naudotų jį kaip kitos dalies įvestį. Po vamzdžio „Myles“ kviečia „awk“ komandą, kuri yra galinga modelio nuskaitymo programa. Naudojant -F vėliavą, jis sako komandai, kad kitas simbolis (po tarpo) bus tai, kas apibrėžia „lauko separatorių“. Šiuo atveju tai yra laikotarpis.

    Dabar awk mato failą, pavadintą „tastyfile.mp3“, kurį sudaro du laukai: „skanus failas“ ir „mp3“. Galiausiai jis naudoja

    „print $ NF“

    rodyti paskutinį lauką. Jei jūsų failas turi kelis laikotarpius - todėl awk mato kelis laukus - bus rodomas tik paskutinis, kuris yra failo plėtinys.

    3 eilutėje jis sukuria naują failo pavadinimo kintamąjį ir naudoja „basename“ komandą, kad būtų galima nurodyti viską, kas yra $ 1 išskyrus failo plėtinys. Tai daroma naudojant pagrindinį pavadinimą ir suteikiant jam argumentą $ 1, tada pridedant tarpą ir failo plėtinį. Failo plėtinys automatiškai pridedamas dėl kintamojo, kuris nurodo 2 eilutę. Tai būtų daroma

    tastyfile.mp3

    ir įjunkite

    skanus failas

    Paskutinėje eilutėje „Myles“ suformavo komandą, kuri išvedys viską pagal tvarką. Atminkite, kad nėra jokios nuorodos į $ 2, antrąjį scenarijaus argumentą. Šis konkretus scenarijus nukopijuos minėtą failą į jūsų dabartinį katalogą. Puikus darbas Samuel ir Myles!

    Paleisti scenarijus ir $ PATH

    Be to, straipsnyje „Pagrindai“ paminėti, kad scenarijai pagal numatytuosius nustatymus neleidžiama nurodyti kaip komandos. Tai reiškia, kad norėdami paleisti, turite nukreipti į scenarijaus kelią:

    ./scenarijus

    ~ / bin / scenarijus

    Bet, įdėdami savo scenarijus į ~ / bin /, galite tiesiog įvesti jų pavadinimus iš bet kur, kad juos paleistumėte.

    Komentatoriai praleido šiek tiek laiko diskutuodami, kaip tai buvo tinkama, nes nė vienas modernus „Linux“ distancinis sukuria šį katalogą pagal nutylėjimą. Be to, niekas neprisideda prie $ PATH kintamojo pagal nutylėjimą, kuris yra būtinas, kad scenarijai būtų paleisti kaip komandos. Buvau šiek tiek nesuprantamas, nes tikrindamas savo $ PATH kintamąjį, komentatoriai buvo teisūs, tačiau skambinantys scenarijai vis dar dirbo. Sužinojau, kodėl: daugelis šiuolaikinių „Linux“ sričių sukuria specialų failą vartotojo namų kataloge .profile.

    Šį failą skaito „bash“ (nebent .bash_profile yra naudotojo namų kataloge) ir apačioje yra skyrius, kuris prideda ~ / bin / aplanką į $ PATH kintamąjį, jei jis yra. Taigi, tas paslaptis išvalytas. Likusioje serijos dalyje, aš ir toliau įkelsiu scenarijus į ~ / bin / katalogą, nes jie yra vartotojo scenarijai ir jie turėtų būti valdomi naudotojų. Ir atrodo, kad mums nereikia rankos su „PAT PATH“ kintančiu, kad galėtume dirbti.

    Pakartotinės komandos su kilpomis

    Paimkime į vieną iš naudingiausių įrankių geek arsenale, kad galėtume spręsti pasikartojančias užduotis: kilpas. Šiandien aptarsime „už“ kilpas.

    Pagrindinis kontūro kontūras yra toks:

    LIAUJE - VARIABLE; daryti
    komanda1
    komanda2

    vad
    padaryta

    Kintamasis gali būti bet koks kintamasis, nors dažniausiai mažoji „i“ naudojama pagal susitarimą. SĄRAŠAS yra elementų sąrašas; galite nurodyti kelis elementus (juos atskirti tarpu), nukreipti į išorinį tekstinį failą arba naudoti žvaigždutę (*), kad pažymėtumėte kokį nors failą dabartiniame kataloge. Nurodytos komandos yra pažymėtos pagal konvenciją, todėl lengviau matyti lizdą - kilpų prikabinimas į kilpas (kad galėtumėte kilti, kai kilsite).

    Kadangi sąrašai naudoja tarpus kaip ribotuvus - tai reiškia, kad tarpas reiškia perėjimą į kitą sąrašo elementą - failai, kuriuose yra tarpų, nėra labai draugiški. Šiuo metu palikime dirbti su failais be tarpų. Pradėkime nuo paprasto scenarijaus, kad būtų rodomi failai, esantys dabartiniame kataloge. Sukurkite naują scenarijų savo ~ / bin / aplanke „loopscript“. Jei neprisimenate, kaip tai padaryti (įskaitant žymėjimą kaip vykdomąjį ir pridėjus maišos spragą), žr..

    Jame įveskite šį kodą:

    i punkte 1 elementas2 punktas3 punktas4 punktas5 punktas6; daryti
    echo „$ i“
    padaryta

    Kai paleisite scenarijų, jūs turėtumėte gauti tuos sąrašo elementus kaip produkciją.

    Gana paprasta, tiesa? Pažiūrėkime, kas atsitiks, jei ką nors pakeisime. Pakeiskite savo scenarijų, kad būtų pasakyta:

    i į *; daryti
    echo „$ i“
    padaryta

    Kai paleisite šį scenarijų aplanke, turėtumėte gauti failų, kuriuos jis turi kaip išvestį, sąrašą.

    Dabar pakeiskime echo komandą į kažką naudingesnio - tarkim, zip komandą. Būtent, mes įtrauksime failus į archyvą. Paimkime kai kuriuos argumentus mišinyje!

    i i $ @; daryti
    „zip“ archyvas „$ i“
    padaryta

    Yra kažkas naujo! „$ @“ Yra „$ 1 $ 2 $ 3… $ n“ spartusis klavišas. Kitaip tariant, tai yra visas jūsų nurodytų argumentų sąrašas. Dabar žiūrėkite, kas atsitinka, kai paleisiu scenarijų su keliais įvesties failais.

    Galite pamatyti, kurie failai yra mano aplanke. Paleidžiau komandą su šešiais argumentais, ir kiekvienas failas buvo pridėtas prie įrašyto archyvo, pavadinto „archive.zip“. Lengva, tiesa?

    Dėl kilpų yra gana nuostabus. Dabar galite atlikti partijų funkcijas failų sąrašuose. Pvz., Galite nukopijuoti visus scenarijaus argumentus į „zip“ archyvą, perkelti originalus į kitą aplanką ir automatiškai saugoti kopiją, kad „zip“ failas būtų perkeliamas į nuotolinį kompiuterį. Jei nustatote pagrindinius failus su SSH, jums net nereikės įvesti savo slaptažodžio ir netgi galite pasakyti scenarijui ištrinti zip failą jį įkėlus!


    Naudojant „for-loop“ („kilpų“) naudojimas leidžia lengvai atlikti visus katalogo veiksmus. Galite sukrauti įvairias komandas kartu ir naudoti labai lengvai pateikiamus argumentus, kad sukurtumėte ir pateiktumėte sąrašą, ir tai tik ledkalnio viršūnė.

    Bash scenarijai, ar turite pasiūlymų? Ar padarėte naudingą scenarijų, kuriame naudojami kilpos? Norite pasidalinti mintimis apie seriją? Palikite keletą komentarų ir padėkite kitiems scenarijų naujokams!