"Shell" scenarijų 2 pradedantiesiems vadovas: "Loops"

Turinys:

"Shell" scenarijų 2 pradedantiesiems vadovas: "Loops"
"Shell" scenarijų 2 pradedantiesiems vadovas: "Loops"

Video: "Shell" scenarijų 2 pradedantiesiems vadovas: "Loops"

Video:
Video: Secret Google Messages Tricks & Tips! (2022) 2024, Balandis
Anonim
Jei norite sukurti savo "geek cred", prisijunkite prie antrosios įmokos mūsų serijos "shell" scenarijų. Mes turime keletą pataisymų, keletą patobulinimų praeitos savaitės scenarijui ir gaires, skirtas lošimui nepaskelbtiems.
Jei norite sukurti savo "geek cred", prisijunkite prie antrosios įmokos mūsų serijos "shell" scenarijų. Mes turime keletą pataisymų, keletą patobulinimų praeitos savaitės scenarijui ir gaires, skirtas lošimui nepaskelbtiems.

Datecp scenarijus peržiūrėtas

Pirmoje mūsų shell scenarijų vadovo dalyje mes sukūrėme scenarijų, kuris nukopijavo failą į atsarginių kopijų katalogą, pridedant datą iki failo pavadinimo pabaigos.

Samuelis Dionne-Rielas savo pastabose pažymėjo, kad yra geresnis būdas tvarkyti mūsų kintamųjų nuorodas.

Arguments are space-separated in the bash shell, it will tokenize when there is a space in the resulted expanded command. In your script,

cp $1 $2.$date_formatted

veiks taip, kaip numatyta, jei išplėstiniai kintamieji neturi tarpų. Jei paskambinsite savo scenarijumi tokiu būdu:

datecp 'my old name' 'my new name'

išplėtimas atliks šią komandą:

cp my new name my old name.the_date

kuris iš tikrųjų turi 6 argumentus.

Norėdami tinkamai išspręsti šią problemą, paskutinė scenarijaus eilutė turėtų būti:

cp '$1' '$2.$date_formatted'

Kaip matote, keičiame scenarijaus eilutę iš:

cp -iv $1 $2.$date_formatted

į:

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

bus pasirūpinti šia problema, kai naudosite scenarijų rinkmenose, kurių pavadinime yra tarpų. Samuelis taip pat nurodo, kad kopijuojant ir įklijuojant kodą iš šios svetainės (arba visame internete) būtinai pakeiskite tinkamus brūkšnelius ir "tipologiškai geresnių" citatų, kurie dažnai juos pakeičia. Mes taip pat darysime dar daugiau, kad įsitikintume, jog mūsų kodas yra daugiau kopijuoti / įklijuoti.;-)

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

tastyfile.mp3.07_14_11-12.34.56

mes galėtume tai gauti:

tastyfile.07_14_11-12.34.56.mp3

kuris tampa šiek tiek patogesnis daugeliui vartotojų. Jo kodas yra jo "GitHub" puslapyje. Pažvelkime į tai, ką jis naudoja norėdamas išskleisti failo pavadinimą.

date_formatted=$(date +%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

Aš šiek tiek pakeitė formatavimą, bet jūs galite pamatyti, kad Myles paskelbia savo datos funkciją eilutėje 1. Tačiau eilutėje 2 jis naudoja "echo" komandą su pirmu scenarijaus argumentu, norėdamas išvesti failo pavadinimą. Jis naudoja vamzdžių komandą, kad panaudotų tą produkciją ir naudotų ją kaip kitą dalį. Po vamzdžio Myles ragina "awk" komandą, kuri yra galinga modelio nuskaitymo programa. Naudojant -F vėliavą, jis sako komandai, kad kitas simbolis (po tarpo) yra tai, kas apibrėš "lauko skirtuką". Šiuo atveju tai yra laikotarpis.

Dabar awk failą pavadinimu "tastyfile.mp3" sudaro du laukai: "tastyfile" ir "mp3". Galiausiai jis naudoja

‘{print $NF}’

rodyti paskutinį lauką. Jei jūsų rinkmena turi kelis laikotarpius, taigi awk pamatys kelis laukus, bus rodomas tik tas, kuris yra failo plėtinys.

3 eilutėje jis sukuria naują kintamąjį failo vardui ir naudoja komandą "basename", nurodydamas viską iš $ 1 išskyrus failo plėtinys. Tai atliekama naudojant bazinį vardą ir suteikdama $ 1 kaip argumentą, tada pridedant tarpą ir failo plėtinį. Failo plėtinys automatiškai pridedamas dėl kintamojo, kuris nurodo 2 eilutę. Tai, ko tai padarys, yra imtis

tastyfile.mp3

ir paversk ją

tastyfile

Tada paskutinėje eilutėje Myles sukūrė komandą, kuri išves visas, kad būtų. Atkreipkite dėmesį, kad nėra nuorodos į $ 2, antrasis scenarijaus argumentas. Šis konkretus scenarijus kopijuoja minėtą failą į jūsų dabartinį katalogą. Puikus darbas Samuelis ir Myles!

Veikia scenarijus ir $ PATH

Mes taip pat paminėjame savo "Basics" straipsnį, kad scenarijai neleidžiami kaip nuorodos pagal nutylėjimą. Tai reiškia, kad turite paleisti scenarijų kelią:

./script

~/bin/script

Tačiau, pateikdami savo scenarijus į ~ / bin /, galite tiesiog įvesti jų pavadinimus iš bet kurios vietos, kad jie būtų paleisti.

"Commenters" šiek tiek laiko diskutavo, kaip tai buvo tinkamai, nes šiuolaikinis "Linux" distribukas pagal nutylėjimą kuria šį katalogą. Be to, nė vienas jo neįtraukia į kintamąjį $ PATH, o tai yra tai, kas reikalinga norint, kad scenarijai būtų paleisti kaip ir komandos. Aš buvau šiek tiek nuliūdęs, nes patikrinus mano $ PATH kintamąjį, komentatoriai buvo teisūs, bet skambinti skriptai vis dar dirbo man. Aš sužinojo, kodėl: daugelis šiuolaikinių "Linux distros" sukuria specialų failą vartotojo namų kataloge -.profile.

Šis failas yra perskaitytas bash (išskyrus atvejus, kai.bash profile yra vartotojo namų kataloge) ir apačioje, yra skyrius, kuris prideda ~ / bin / aplanką prie $ PATH kintamojo, jei jis egzistuoja. Taigi, šis slėpinys yra išvalytas. Dėl likusios serijos, aš toliau priskirti scenarijus ~ / bin / kataloge, nes jie yra vartotojo scenarijai ir turėtų būti, kad juos galėtų tvarkyti naudotojai. Ir atrodo, kad mums tikrai nereikia netvarkos su kintamuoju $ PATH rankomis, kad viskas veiktų.
Šis failas yra perskaitytas bash (išskyrus atvejus, kai.bash profile yra vartotojo namų kataloge) ir apačioje, yra skyrius, kuris prideda ~ / bin / aplanką prie $ PATH kintamojo, jei jis egzistuoja. Taigi, šis slėpinys yra išvalytas. Dėl likusios serijos, aš toliau priskirti scenarijus ~ / bin / kataloge, nes jie yra vartotojo scenarijai ir turėtų būti, kad juos galėtų tvarkyti naudotojai. Ir atrodo, kad mums tikrai nereikia netvarkos su kintamuoju $ PATH rankomis, kad viskas veiktų.

Kartojantys komandos su kilpomis

Paimkime vieną iš labiausiai naudingų įrankių "geek arsenalą", skirtą pasikartojantiems uždaviniams spręsti: kilpos. Šiandien mes aptarsime "už" kilpas.

Pagrindinės kontūro formos yra tokios:

for VARIABLE in LIST; do command1 command2 … commandn done

VARIABLE gali būti bet koks kintamasis, nors dažniausiai mažoji "i" naudojama sutinkamai. SĄRAŠAS yra prekių sąrašas; galite nurodyti keletą elementų (atskirti juos tarpu), nukreipti į išorinį teksto failą arba naudoti žvaigždutę (*), kad pažymėtumėte bet kurį failą dabartiniame kataloge. Išvardytos komandos yra išdėstytos išdėstytais susitarimais, todėl lengviau pamatyti lizdus - lenkų kilpų sukūrimas (kad galėtumėte pagreitinti kilpa).

Kadangi sąrašai naudoja tarpus kaip skirtines, ty tarpas reiškia perėjimą prie kito sąrašo elemento - failai, kurių pavadinime yra tarpų, nėra labai draugiški. Šiuo metu leiskite dirbti su failais be tarpų. Pradėkite nuo paprasto scenarijaus, rodančio failų pavadinimus dabartiniame kataloge. Sukurkite naują scenarijų savo ~ / bin / aplanke pavadinimu "loopscript". Jei nepamenu, kaip tai padaryti (taip pat pažymėkite jį vykdomuoju ir pridedate hash bang hack), žr. Mūsų bash scenarijų pagrindų straipsnį.

Jame įveskite šį kodą:

for i in item1 item2 item3 item4 item5 item6; do echo “$i” done

Kai paleisite scenarijų, turėtumėte tik gauti tuos sąrašo elementus kaip produkciją.
Kai paleisite scenarijų, turėtumėte tik gauti tuos sąrašo elementus kaip produkciją.
Gana paprasta, ar ne? Pažiūrėkime, kas atsitiks, jei pakeisime šiek tiek. Pakeiskite savo scenarijų taip, kad tai sako:
Gana paprasta, ar ne? Pažiūrėkime, kas atsitiks, jei pakeisime šiek tiek. Pakeiskite savo scenarijų taip, kad tai sako:

for i in *; do echo “$i” done

Kai paleidžiate šį scenarijų aplanke, turėtumėte gauti failų, kuriuos jis turi kaip išvestį, sąrašą.
Kai paleidžiate šį scenarijų aplanke, turėtumėte gauti failų, kuriuos jis turi kaip išvestį, sąrašą.
Dabar pakeiskime echo komandą į kažką daugiau naudingos - pasakykite zip komandą. Būtent, mes pridėsime failus į archyvą. Ir gausime keletą argumentų mišinyje!
Dabar pakeiskime echo komandą į kažką daugiau naudingos - pasakykite zip komandą. Būtent, mes pridėsime failus į archyvą. Ir gausime keletą argumentų mišinyje!

for i in $@; do zip archive “$i” done

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ų keliais įvesties failais.
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ų keliais įvesties failais.
Galite pamatyti, kurie failai yra mano aplanke. Aš paleisdavau komandą su šešiais argumentais, o kiekvienas failas buvo pridėtas į zip archyvą, pavadintą "archive.zip". Lengva, ar ne?
Galite pamatyti, kurie failai yra mano aplanke. Aš paleisdavau komandą su šešiais argumentais, o kiekvienas failas buvo pridėtas į zip archyvą, pavadintą "archive.zip". Lengva, ar ne?

Dėl kilpų yra gana nuostabu. Dabar galite paleisti partijos funkcijas failų sąrašuose. Pvz., Galite kopijuoti visus savo scenarijaus argumentus į archyvą su užtrauktuku, perkelti originalus į kitą aplanką ir automatiškai apsaugoti tą ZIP failą nukopijuoti į nuotolinį kompiuterį. Jei nustatysite pagrindinius failus naudodami SSH, jums nereikės net įvesti savo slaptažodžio, ir jūs netgi galite papasakoti scenarijų ištrinti zip failą po jo įkėlimo!

Naudojant for-loops galima lengvai atlikti daugybę veiksmų, susijusių su visais kataloge esančiais failais. Galite sukaupti įvairias komandas kartu ir lengvai susikurti argumentus, kad galėtumėte kurti sąraše, o tai tik ledkalnio viršūnė.

Basho scenaristams, ar turite kokių nors pasiūlymų? Ar jūs sukūrėte naudingą scenarijų, kuriame naudojamos kilpos? Norite pasidalinti mintimis apie seriją? Palikite kai kurias pastabas ir padėkite kitiems scenarijus naujokams!

Rekomenduojamas: