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

Sadržaj:

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

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

Video: Vodič za početnike Shell Scripting 2: Za petlje
Video: CS50 2015 - Week 4 - YouTube 2024, Travanj
Anonim
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.
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.

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.

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.
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:

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

Kada pokrenete skriptu, trebali biste dobiti one stavke popisa kao izlaz.
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:
Vrlo jednostavno, zar ne? Pogledajmo što će se dogoditi ako nešto promijenimo. Promijenite skriptu tako da to kaže:

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

Kada pokrenete ovu skriptu u mapi, trebali biste nabaviti popis datoteka koje sadrži kao izlaz.
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!
Sada promijenimo naredbu odjek u nešto korisnije - recimo, zip naredbu. Naime, datoteke ćemo dodati u arhivu. I, dobijemo neke argumente u miksu!

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

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.
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?
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!

Preporučeni: