Príručka pre začiatočníkov pre Shell skriptovanie 2: Pre slučky

Obsah:

Príručka pre začiatočníkov pre Shell skriptovanie 2: Pre slučky
Príručka pre začiatočníkov pre Shell skriptovanie 2: Pre slučky

Video: Príručka pre začiatočníkov pre Shell skriptovanie 2: Pre slučky

Video: Príručka pre začiatočníkov pre Shell skriptovanie 2: Pre slučky
Video: Super GOOGLE: Top 12 Advanced Search Techniques 2024, Apríl
Anonim
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 opráv, niekoľko vylepšení skriptov z minulého týždňa a sprievodcu pre slučky pre nezasvätených.
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 opráv, niekoľko vylepšení skriptov z minulého týždňa a sprievodcu pre slučky pre nezasvätených.

Skript datecp Revisited

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 variabilné referencie.

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

bude pracovať tak, ako to má, pokiaľ rozšírené premenné nemajú medzery v nich. Ak voláte skript takto:

datecp 'my old name' 'my new name'

rozšírenie bude mať za následok tento príkaz:

cp my new name my old name.the_date

ktorý 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.$date_formatted

na adresu:

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

sa tento problém postará pri používaní skriptu na súbory, ktoré majú medzery 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=$(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

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í Myles volá príkaz "awk", čo je výkonný skenovací program. Pomocou príznaku -F povie príkazu, ž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}’

zobraziť posledné pole. V prípade, že váš súbor má niekoľko periód - a preto robíte awk vidieť viac polí - 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ípona súboru. To sa deje pomocou názvu mien a dá sa $ 1 ako jeho argument, potom pridajte medzeru a príponu súboru. Prípona súboru sa automaticky pridáva kvôli premennej, ktorá odkazuje na riadok 2. Čo to urobí, je to

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í označovať 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.

Spokojitelia strávili nejaký čas diskutovaním o tom, ako správne to bolo, pretože žiadny moderný linuxový distro nevytvára tento adresár štandardne. Navyše, nikto ho nepridáva do premennej $ PATH, a to je to, čo je potrebné na spustenie skriptov ako príkazov. Bol som trochu zmätený, pretože po kontrole moja $ PATH premenná, commenters mali pravdu, 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.

Image
Image

Tento súbor sa číta od bash (pokiaľ nie je v domovskom adresári používateľa.bash_profile) av dolnej časti je časť, ktorá pridáva priečinok ~ / bin / premennú $ 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 s peniazmi $ PATH chytiť ručne, aby sme pracovali.

Opakované príkazy 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: slučky. Dnes budeme diskutovať o "slučkách".

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

for VARIABLE in LIST; do command1 command2 … commandn done

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 - vkladanie slučiek do slučiek (takže si môžete smyčiť pri sluč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 jeho označenia ako spustiteľného súboru a pridania hackovania), pozrite si náš základný článok o základoch skriptovania bash.

V ňom zadajte nasledujúci kód:

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

Keď spustíte skript, mali by ste len získať tieto položky zoznamu ako výstup.
Keď spustíte skript, mali by ste len získať tieto položky zoznamu ako výstup.
Docela jednoduché, nie? Pozrime sa, čo sa stane, ak trochu zmeníme veci. Zmeňte svoj skript tak, aby to hovorilo takto:
Docela jednoduché, nie? Pozrime sa, čo sa stane, ak trochu zmeníme veci. Zmeňte svoj skript tak, aby to hovorilo takto:

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

Pri spustení tohto skriptu v priečinku by ste mali získať zoznam súborov, ktoré obsahuje ako výstup.
Pri spustení tohto skriptu v priečinku by ste mali získať zoznam súborov, ktoré obsahuje ako výstup.
Teraz, zmeniť príkaz ozveny na niečo užitočnejšie - povedzme príkaz zip. Konkrétne pridáme súbory do archívu. A dajme pár argumentov v mixe!
Teraz, zmeniť príkaz ozveny na niečo užitočnejšie - povedzme príkaz zip. Konkrétne pridáme súbory do archívu. A dajme pár argumentov v mixe!

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

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.
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, nie?
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, nie?

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 do vzdialeného počítača. Ak nastavíte kľúčové súbory s SSH, nebudete musieť ani zadávať svoje heslo a dokonca môžete skriptu vynechať súbor zip po jeho načítaní!

Použitie for-slučky uľahčuje vykonanie množstva akcií pre všetky súbory v adresári. Môžete hromadiť š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 skriptov!

Odporúča: