Úvodná » ako » Príručka pre začínajúcich používateľov Shell Scripting 2 For Loops

    Príručka pre začínajúcich používateľov Shell Scripting 2 For Loops

    Ak chcete vytvoriť svoj geek cred, pridajte sa k nám pre druhú splátku v našich shell skriptovacích sériách. Máme niekoľko korekcií, niekoľko vylepšení minulého týždňa v písme a sprievodcu pre slučky pre nezasvätených.

    Skript dátumu písaný znovu

    V prvej časti našej príručky skriptu pre shell sme vytvorili skript, ktorý skopíroval súbor do záložného adresára po pridaní dátumu do konca názvu súboru.

    Samuel Dionne-Riel v komentároch poukázal na to, že máme oveľa lepší spôsob, ako zvládnuť naše premenné referencie.

    Argumenty sú oddelené vo vesmíre v bash shell, tokenize, keď je vo výslednom rozbalenom príkaze priestor. Vo vašom skripte, cp $ 1 $ 2. $ date_formatted bude pracovať tak, ako to bolo určené, kým rozšírené premenné nemajú medzery v nich. Ak takto skript voláte: datecp "môj starý názov" "moje nové meno" rozšírenie bude mať za následok tento príkaz: cp môj nový názov môj starý name.the_date čo má v skutočnosti 6 argumentov.

    Ak chcete správne vyriešiť tento problém, posledný riadok skriptu by mal byť: cp "$ 1" "$ 2. $ date_formatted"

    Ako môžete vidieť, zmena riadku nášho skriptu z:

    cp -iv $ 1 $ 2. $ dátum_formátovaný

    na adresu:

    cp -iv "$ 1" "$ 2". $ date_formatted

    sa o tento problém postará pri použití skriptu na súboroch s medzerami v názve. Samuel tiež poukazuje na to, že pri kopírovaní a vkladaní kódu z tejto stránky (alebo internetu vo všeobecnosti) nezabudnite nahradiť správne pomlčky a citáty pre tie "typograficky lepšie", ktoré ich často nahrádzajú. Budeme tiež robiť viac, aby sme sa uistili, že náš kód je viac kopírovať / prilepiť. ;-)

    Ďalšie komentátor, Myles Braithwaite, sa rozhodol rozšíriť náš skript tak, aby sa dátum pred rozšírením súboru zobrazil. Takže namiesto toho

    tastyfile.mp3.07_14_11-12.34.56

    dostali by sme toto:

    tastyfile.07_14_11-12.34.56.mp3

    čo je pre väčšinu používateľov trochu výhodnejšie. Jeho kód je k dispozícii na jeho stránke GitHub. Poďme sa pozrieť na to, čo používa na rozbitie názvu súboru.

    date_formatted = $ (dátum +% Y-% m-% d_% H.% M% S)
    file_extension = $ (echo "$ 1" | awk -F. 'print $ NF')
    file_name = $ (názov databázy $ 1. $ file_extension)

    cp -iv $ 1 $ názov_souboru- $ date_formatted. $ file_extension

    Formátovanie som trochu zmenil, ale môžete vidieť, že Myles deklaruje svoju funkciu dátumu v riadku 1. V riadku 2 však používa príkaz "echo" s prvým argumentom skriptu na zadanie názvu súboru. Pomocou príkazu potrubia použije tento výstup a použije ho ako vstup pre ďalšiu časť. Po potrubí volá Myles príkaz "awk", čo je výkonný skenovací program. Použitím príznaku -F povie príkaz, že nasledujúci znak (po medzere) bude definovať "oddeľovač polí". V tomto prípade ide o obdobie.

    Teraz, awk vidieť súbor s názvom "tastyfile.mp3" ako zložený z dvoch polí: "tastyfile" a "mp3". Nakoniec používa

    'print $ NF'

    na zobrazenie posledného poľa. V prípade, že váš súbor má viacero periód - a preto sa v priečinku awk zobrazia viaceré polia - zobrazí sa iba posledná, čo je prípona súboru.

    V riadku 3 vytvorí novú premennú pre názov súboru a použije príkaz "basename" na označenie všetkého v $ 1 okrem príponu súboru. To sa deje pomocou názvu priečinka a jeho argumentom je $ 1, potom sa pridá priestor a prípona súboru. Prípona súboru sa automaticky pridáva kvôli premennej, ktorá odkazuje na riadok 2. Čo urobí, je to urobiť

    tastyfile.mp3

    a premeniť ho

    tastyfile

    Potom v poslednom riadku Myles dal dohromady príkaz, ktorý bude všetko v poriadku. Všimnite si, že neexistuje žiadny odkaz na $ 2, druhý argument pre skript. Tento konkrétny skript skopíruje daný súbor do vášho aktuálneho adresára. Skvelá práca Samuel a Myles!

    Spúšťanie skriptov a $ PATH

    V článku nášho článku Základy tiež spomíname, že skripty nemožno v predvolenom nastavení odkazovať na príkazy ako príkazy. To znamená, že musíte spustiť cestu k skriptu:

    ./ script

    ~ / Bin / script

    Ale umiestnením skriptov do priečinka ~ / bin / môžete len zadať ich mená odkiaľkoľvek, aby ste ich spustili.

    Komentátori strávili nejaký čas diskutovaním o tom, ako správne to bolo, pretože žiadna moderná linka Linuxu nevytvára tento adresár štandardne. Navyše, nikto ho nepridáva do premennej $ PATH, čo je to, čo je potrebné na to, aby sa skripty spustili ako príkazy. Bol som trochu zmätený, pretože po kontrole môjho $ PATH premennej, commenters boli správne, ale volanie skriptov stále pracoval pre mňa. Zistil som, prečo: veľa moderných distribučných liniek Linuxu vytvára špeciálny súbor v domovskom adresári užívateľa - .profile.

    Tento súbor sa číta od bash (ak nie je v domovskom adresári používateľa .bash_profile) av dolnej časti je časť, ktorá pridáva priečinok ~ / bin / do premennej $ PATH, ak existuje. Takže toto tajomstvo je jasné. Po zvyšok série budem pokračovať v umiestňovaní skriptov v adresári ~ / bin /, pretože sú skripty používateľa a mali by byť schopné ich spravovať používatelia. A zdá sa, že naozaj sa nemusíte pokúšať o premenu $ PATH ručne, aby ste pracovali.

    Opakovanie príkazov pomocou slučiek

    Poďme sa dostať k jednému z najužitočnejších nástrojov v geek arzenáli pre riešenie opakujúcich sa úloh: smyčky. Dnes budeme diskutovať o "slučkách".

    Základný obrys for-loop je nasledovný:

    pre VARIABLE v ZOZNAME; robiť
    Command1
    príkaz2
    ...
    commandn
    hotový

    VARIABLE môže byť akákoľvek premenná, aj keď najčastejšie sa používa malá písmena "i". ZOZNAM je zoznam položiek; môžete určiť viacero položiek (oddeľovať ich medzerou), poukázať na externý textový súbor alebo použiť hviezdičku (*) na označenie ľubovoľného súboru v aktuálnom adresári. Uvedené príkazy sú odsadené konvenciou, takže je ľahšie vidieť hniezdenie - uvedenie slučiek do slučiek (takže si môžete smyčiť pri smyčke).

    Pretože zoznamy používajú medzery ako oddeľovače - to znamená, že medzera znamená presun na ďalšiu položku v zozname - súbory s medzerami v názve nie sú veľmi priateľské. Pre túto chvíľu budeme pracovať so súbormi bez medzery. Začnime jednoduchým skriptom na zobrazenie mien súborov v aktuálnom adresári. Vytvorte nový skript vo vašom priečinku ~ / bin / s názvom "loopscript". Ak si nepamätáte, ako to urobiť (vrátane označenia ako spustiteľného súboru a pridania hash bang hack), pozrite sa na náš základný článok pre skriptovanie bash.

    V ňom zadajte nasledujúci kód:

    pre i v položke 1 položka2 položka3 položka4 položka5 položka6; robiť
    echo "$ i"
    hotový

    Pri spustení skriptu by ste mali dostať len tieto položky zoznamu ako výstup.

    Docela jednoduché, že? Pozrime sa, čo sa stane, ak trochu zmeníme veci. Zmeňte svoj skript tak, aby to hovorilo takto:

    pre i v *; robiť
    echo "$ i"
    hotový

    Pri spustení tohto skriptu v priečinku by ste mali získať zoznam súborov, ktoré obsahuje ako výstup.

    Teraz zmeniť príkaz echo na niečo užitočnejšie - povedzme príkaz zip. Konkrétne pridáme súbory do archívu. A dajme do nej nejaké argumenty!

    pre i v $ @; robiť
    zip archív "$ i"
    hotový

    Je tu niečo nové! "$ @" Je skratka pre "$ 1 $ 2 $ 3 ... $ n". Inými slovami, je to úplný zoznam všetkých zadaných argumentov. Pozrite sa, čo sa stane, keď spustím skript s niekoľkými vstupnými súbormi.

    Môžete vidieť, ktoré sú súbory v mojej zložke. Spustil som príkaz so šiestimi argumentmi a každý súbor bol pridaný do zipsového archívu s názvom "archive.zip". Jednoducho, správne?

    Pre slučky sú skvelé. Teraz môžete v zoznamoch súborov spustiť dávkové funkcie. Napríklad môžete skopírovať všetky argumenty skriptu do zipsového archívu, presunúť originály do iného priečinka a automaticky zabezpečiť kopírovanie súboru zip na vzdialený počítač. Ak nastavíte kľúčové súbory s SSH, nebudete musieť ani zadať heslo a skript môžete dokonca povedať, aby ste po načítaní súboru zip odstránili!


    Použitie for-loops uľahčuje vykonanie množstva akcií pre všetky súbory v adresári. Môžete stohovať širokú škálu príkazov dohromady a používať argumenty veľmi ľahko vytvoriť a on-the-lietať zoznam, a to je len špička ľadovca.

    Bash scripters, máte nejaké návrhy? Urobili ste užitočný skript, ktorý používa slučky? Chcete sa s vami podeliť o svoje myšlienky? Ponechajte nejaké pripomienky a pomôžte ostatným nováčikom v skriptovaní!