If-Koubou

Vodič za početnike Shell Scripting 2: Za petlje

Vodič za početnike Shell Scripting 2: Za petlje (Kako da)

Ako želite izgraditi svoj geek krediti, pridružite nam se za drugu ratu u nizu skriptnih skica. Imamo nekoliko ispravaka, nekoliko poboljšanja u prošlotjednom scenariju i vodič za petlje za nepoduzetnika.

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.

Argumenti su razmaknuti od razmaka u bash shell, on će tokenizirati kada postoji prostor u rezultirajućoj proširenoj naredbi. U vašem scenariju, 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 "moje staro ime" "moje novo ime" ekspanzija će rezultirati ovom naredbom: cP moje novo ime moje stare ime.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 = $ (datum +% Y-% m-% d_% H.% M% S)
file_extension = $ (echo "$ 1" | awk -F. 'print $ NF')
file_name = $ (naziv baze $ 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.

Tu datoteku pročitajte bash (osim ako je .bash_profile prisutan u korisničkom kućnom imeniku), a na dnu postoji odjeljak koji dodaje ~ / bin / mapu u varijablu $ PATH ako postoji. Dakle, taj je otajstvo izbrisan. Za ostatak serije nastavit ću stavljati skripte u ~ / bin / direktorij jer su korisničke skripte, a korisnici bi trebali moći upravljati. I čini se da mi zapravo ne trebamo ručno podešavati varijablu $ PATH kako bismo radili stvari.

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:

za VARIJABLE u LIST; čini
command1
command2

commandn
učinio

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:

za i u stavci1 stavci2 sadržaj3 predmeti4 sadržaj5 predmeti6; čini
echo "$ i"
učinio

Kada pokrenete skriptu, trebali biste dobiti one stavke popisa kao izlaz.

Vrlo jednostavno, zar ne? Pogledajmo što će se dogoditi ako nešto promijenimo. Promijenite skriptu tako da to kaže:

za ja u *; čini
echo "$ i"
učinio

Kada pokrenete ovu skriptu u mapi, trebali biste nabaviti popis datoteka koje sadrži kao izlaz.

Sada promijenimo naredbu odjek u nešto korisnije - recimo, zip naredbu. Naime, datoteke ćemo dodati u arhivu. I, dobijemo neke argumente u miksu!

za i u $ @; čini
zip arhiva "$ i"
učinio

Nešto je novo! "$ @" Prečac za "$ 1 $ 2 $ 3 ... $ n". Drugim riječima, to je popis svih argumenata koje ste naveli. Sada, pogledajte što se događa kada pokrenem skriptu s nekoliko ulaznih datoteka.

Možete vidjeti koje su datoteke u mojoj mapi. Pokrenuo sam naredbu s šest argumenata, a svaka je datoteka dodana u zipnu arhivu pod nazivom "archive.zip". Jednostavno, zar ne?

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!