Skenirajući datumcp skripta
U prvoj inačici našeg vodiča za skriptiranje ljuske sastavili smo skriptu koja je kopirala datoteku u rezervni direktorij nakon dodavanja datuma do kraja naziva datoteke.
Samuel Dionne-Riel istaknuo je u komentarima da postoji mnogo bolji način za obradu naših promjenjivih referenci.
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
funkcionira kako je zamišljeno dok proširene varijable ne sadrže razmake u njima. Ako pozivate skriptu na ovaj način:
datecp 'my old name' 'my new name'
ekspanzija će rezultirati ovom naredbom:
cp my new name my old name.the_date
koji zapravo ima 6 argumenata.
Kako bi se ispravno riješio ovaj problem, zadnji redak skripte trebao bi biti:
cp '$1' '$2.$date_formatted'
Kao što možete vidjeti, mijenjanje retka skripte od:
cp -iv $1 $2.$date_formatted
do:
cp -iv “$1” “$2”.$date_formatted
će se pobrinuti za taj problem prilikom korištenja skripte na datotekama koje sadrže razmake u imenu. Samuel također naglašava da prilikom kopiranja i lijepljenja koda s ovog web mjesta (ili interneta općenito) svakako zamijenite odgovarajuće crtice i navode za "tipografski bolje" one koji ih često zamjenjuju. Također ćemo raditi više kako bismo osigurali da naš kôd bude više prilagođen za kopiranje / lijepljenje.;-)
Drugi komentator, Myles Braithwaite, odlučio je proširiti našu skriptu tako da bi se datum pojavio pred datotečnim nastavkom. Umjesto toga
tastyfile.mp3.07_14_11-12.34.56
mi ćemo ovo dobiti:
tastyfile.07_14_11-12.34.56.mp3
što završava jednostavnijim za većinu korisnika. Njegov kod dostupan je na stranici GitHub. Pogledajmo što koristi za razdvajanje naziva datoteke.
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
Malo sam promijenio oblikovanje, ali vidjet ćete da Myles izjavljuje svoju funkciju datuma u Lini 1. Međutim, u retku 2 koristi naredbu "echo" s prvim argumentom skripte za izlazak naziva datoteke. Upotrebljava naredbu za cijevi da preuzme taj izlaz i koristi ga kao ulaz za sljedeći dio. Nakon cijevi, Myles poziva naredbu "awk", što je snažan program skeniranja uzoraka. Upotrebljavajući -F zastavu, on govori naredbi da sljedeći znak (nakon razmaka) bude ono što će definirati "separator polja". U ovom slučaju, to je razdoblje.
Sada, awk pogledajte datoteku pod nazivom "tastyfile.mp3" koja se sastoji od dva polja: "ukusna datoteka" i "mp3". Konačno, on koristi
‘{print $NF}’
za prikaz posljednjeg polja. U slučaju da vaša datoteka ima više razdoblja - stoga stvaranje awk vidjeti više polja - ona će samo prikazati posljednji, što je produžetak datoteke.
U retku 3 stvara novu varijablu za naziv datoteke i upotrebljava naredbu "naziv baze" kako bi se sve referiralo u $ 1 osim datotečni nastavak. To se postiže korištenjem naziva baze i dajući joj $ 1 kao argument, a zatim dodavanje prostora i proširenja datoteke. Proširenje datoteke automatski se dodaje zbog varijable koja upućuje na liniju 2. Što bi to trebalo poduzeti
tastyfile.mp3
i pretvoriti ga u
tastyfile
Zatim u zadnjem retku, Myles sastavlja naredbu koja će izlaziti sve u redu. Imajte na umu da nema reference na $ 2, drugi argument za skriptu. Ova posebna skripta umjesto toga će kopirati navedenu datoteku u vašu trenutnu mapu. Veliki posao Samuel i Myles!
Running Scripts i $ PATH
U članku Osnove također spominjemo da skripte ne smiju biti referencirane kao naredbe prema zadanim postavkama. To jest, morate uputiti na stazu skripte kako bi ga pokrenuli:
./script
~/bin/script
No, postavljanjem skripti u ~ / bin /, mogli biste samo upisati njihova imena s bilo kojeg mjesta da biste ih pokrenuli.
Komentari su proveli neko vrijeme raspravljati o tome kako je to bilo ispravno, jer nijedan moderni Linux distro ne stvara taj direktorij prema zadanim postavkama. Nadalje, nitko ga ne dodaje standardno $ PATH prema zadanim postavkama, što je ono što je potrebno kako bi se skripte izvodile poput naredbi. Bio sam pomalo zbunjen jer sam nakon provjere moje varijable $ PATH, komentari su bili u pravu, ali pozivanje skripti još uvijek radi za mene. Otkrio sam zašto: mnogi moderni Linux distrusi stvaraju posebnu datoteku u korisničkom kućnom imeniku -.profile.
Ponavljanje naredbi s petljama
Idemo do jednog od najkorisnijih alata u geek arsenalu za rješavanje ponavljajućih zadataka: petlje. Danas ćemo razgovarati o "za" petlje.
Osnovni pregled for-loop je kako slijedi:
for VARIABLE in LIST; do command1 command2 … commandn done
VARIJABLE može biti bilo koja varijabla, iako je najčešće mala slova "i" korištena konvencijom. POPIS je popis stavki; možete odrediti više stavki (razdvajajući ih razmakom), pokažite na vanjsku tekstualnu datoteku ili označite zvjezdicu (*) kako biste označili bilo koju datoteku u trenutnom direktoriju. Navedene naredbe razvučene su konvencijom, pa je lakše vidjeti gniježđenje - stavljajući petlje u petlje (tako da možete petlje dok ste petlja).
Budući da se popisi koriste kao razgraničivači - to jest, prostor označava premještanje na sljedeću stavku na popisu - datoteke koje imaju razmake u imenu nisu baš prijateljski. Za sada, držimo se raditi s datotekama bez razmaka. Počnimo s jednostavnom skriptom za prikaz imena datoteka u trenutnom direktoriju. Napravite novu skriptu u ~ / bin / mapi pod nazivom "loopscript". Ako se ne sjećate kako to možete učiniti (uključujući označavanje kao izvršnu i dodavanje hakerskog bang hacka), pogledajte naš članak o osnivanju skripti.
U njemu unesite sljedeći 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
Jer petlje su prilično prekrasne. Sada možete izvršiti skupne funkcije na popisima datoteka. Na primjer, možete kopirati sve argumente skripte u zipnu arhivu, premjestiti izvornike u drugu mapu i automatski kopirati taj zip datoteku na udaljeno računalo. Ako postavite ključne datoteke s SSH, nećete ni trebati unijeti lozinku, a skriptu možete čak i izbrisati zip datoteku nakon što ga prenesete!
Korištenje for-petlja olakšava rad hrpe akcija za sve datoteke u direktoriju. Možete složiti široku paletu naredbi i vrlo lako upotrijebiti argumente za izradu i popis leta, a to je samo vrh ledenog brijega.
Bash skriptori, imate li kakvih prijedloga? Jeste li napravili korisnu skriptu koja koristi petlje? Želite li podijeliti misli o seriji? Ostavite neke komentare i pomažite novim scenarijima!