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