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.
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
for i in *; do echo “$i” done
for i in $@; do zip archive “$i” done
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!