Navodila za začetnike za skriptiranje Shell 2 Za zanke
Če želite zgraditi svoj računalnik, se nam pridružite za drugi obrok v seriji skriptnih ukazov. Imamo nekaj popravkov, nekaj izboljšav scenarija prejšnjega tedna in vodnik za zankanje za nepoklicane.
Datoteka datecp Script Revisited
V prvem delu našega vodnika skriptnih ukazov smo izdelali skript, ki je kopiral datoteko v imenik za varnostno kopiranje po tem, ko je datum dodal na konec imena datoteke.
Samuel Dionne-Riel je v komentarjih poudaril, da obstaja veliko boljši način za obravnavo naših spremenljivk.
Argumenti so v lupini bash ločeni s presledkom, bo tokeniral, ko bo v razširjenem ukazu prišlo do prostora. V vašem skriptu,
cp $ 1 $ 2. $ date_formatted
bo deloval tako, kot je bilo predvideno, dokler razširjene spremenljivke nimajo prostorov v njih. Če skript pokličete na ta način:datecp "moje staro ime" "moje novo ime"
razširitev bo povzročila ta ukaz:cp moje novo ime moje staro ime.the_datum
ki ima dejansko 6 argumentov.Če želite pravilno odpraviti to težavo, naj bo zadnja vrstica skripta:
cp "$ 1" "$ 2. $ date_formatted"
Kot lahko vidite, spremenite linijo našega skripta iz:
cp -iv $ 1 $ 2. $ date_formatted
do:
cp -iv “$ 1” “$ 2”. $ date_formatted
bo poskrbel za to težavo, ko bo uporabljal skript v datotekah, ki imajo presledke v imenu. Samuel prav tako opozarja, da pri kopiranju in lepljenju kode s tega spletnega mesta (ali interneta na splošno) zagotovite, da boste nadomestili pravilne pomišljaje in citate za »tipografsko boljše« tiste, ki jih pogosto nadomestijo. Prav tako bomo naredili več, da bi zagotovili, da je naša koda bolj primerna za kopiranje / lepljenje. ;-)
Drug komentator, Myles Braithwaite, se je odločil, da bo naš scenarij razširil tako, da bi se datum pojavil pred končnico datoteke. Torej, namesto
tastyfile.mp3.07_14_11-12.34.56
dobili bi to:
tastyfile.07_14_11-12.34.56.mp3
ki postane bolj primerna za večino uporabnikov. Njegova koda je na voljo na njegovi GitHub strani. Oglejmo si, kaj uporablja, da razkrije ime datoteke.
date_formatted = $ (datum +% Y-% m-% d_% H.% M% S)
file_extension = $ (echo "$ 1" | awk -F. 'print $ NF')
file_name = $ (basename $ 1. $ file_extension)cp -iv $ 1 $ ime-datoteke-$ date_formatted. $ file_extension
Oblikovanje sem malo spremenila, vendar lahko vidite, da Myles razglasi njegovo funkcijo datuma v vrstici 1. V vrstici 2 pa uporabi ukaz “echo” s prvim argumentom skripta, da predloži ime datoteke. Uporabi ukaz cevi, da vzame ta izhod in ga uporabi kot vhod za naslednji del. Po cevi Myles pokliče ukaz “awk”, ki je zmogljiv program za skeniranje vzorcev. S pomočjo zastave -F ukazu pove, da je naslednji znak (za presledkom) tisti, ki bo definiral »separator polja«. V tem primeru je to obdobje.
Zdaj, awk vidi datoteko z imenom “tastyfile.mp3”, ki je sestavljena iz dveh polj: “tastyfile” in “mp3”. Nazadnje uporablja
"print $ NF"
za prikaz zadnjega polja. V primeru, da ima vaša datoteka več obdobij, zato bo awk prikazal več polj, bo prikazan le zadnji, ki je končnica datoteke.
V vrstici 3 ustvari novo spremenljivko za ime datoteke in uporabi ukaz "basename" za vse, kar je v $ 1 razen končnico datoteke. To naredite tako, da uporabite osnovno ime in mu podate $ 1 kot argument, nato pa dodate presledek in datotečno pripono. Razširitev datoteke se samodejno doda zaradi spremenljivke, ki se sklicuje na vrstico 2. To bi lahko storili
tastyfile.mp3
in ga pretvorite v
okusna datoteka
Potem v zadnji vrstici, Myles sestavil ukaz, ki bo izpisal vse v redu. Upoštevajte, da ni sklicevanja na $ 2, drugi argument za skript. Ta določen skript bo namesto tega prekopiral datoteko v vaš trenutni imenik. Odlično delo Samuel in Myles!
Izvajanje skript in $ PATH
V članku Osnove omenjamo tudi, da se skriptom privzeto ne smejo omenjati kot ukazi. To pomeni, da morate pokazati na pot skripta, da jo zaženete:
./ skript
~ / bin / script
Toda s tem, ko postavite svoje skripte v ~ / bin /, lahko preprosto vtipkate njihova imena od koderkoli, da jih boste zagnali.
Komentatorji so nekaj časa razpravljali o tem, kako je to pravilno, saj noben sodoben Linux distro privzeto ne ustvari tega imenika. Poleg tega ga nihče ne doda privzeto v spremenljivko $ PATH, kar je potrebno, da se skripti zaženejo kot ukazi. Bil sem malce zmeden, ker so po preverjanju moje $ PATH spremenljivke komentatorji imeli prav, vendar kliče skripte še vedno delal za mene. Ugotovil sem, zakaj: številni moderni Linux distrosi ustvarijo posebno datoteko v uporabnikovem domačem imeniku - .profile.
To datoteko bere bash (razen če je v domačem imeniku uporabnika prisoten .bash_profile) in na dnu je razdelek, ki doda mapo ~ / bin / v spremenljivko $ PATH, če obstaja. Torej je ta skrivnost razjasnjena. Za preostanek serije bom še naprej postavljal skripte v imenik ~ / bin /, ker so uporabniški skripti in bi jih lahko upravljali uporabniki. In se zdi, da se res ne moramo vmešavati s spremenljivko $ PATH z roko, da bi stvari delovale.
Ponavljanje ukazov z zankami
Pojdimo na eno od najbolj uporabnih orodij v arsenalu geek za obvladovanje ponavljajočih se nalog: zank. Danes bomo razpravljali o "za" zanke.
Osnovni obris for-zanke je naslednji:
za SPREMENLJIVO v seznamu; narediti
command1
command2
…
commandn
Končano
VARIJABLE je lahko katera koli spremenljivka, čeprav se najpogosteje uporablja črka »i« po dogovoru. LIST je seznam postavk; določite lahko več elementov (ločite jih s presledkom), pokažete na zunanjo besedilno datoteko ali uporabite zvezdico (*), da označite katero koli datoteko v trenutnem imeniku. Našteti ukazi so zamaknjeni po dogovoru, zato je lažje videti gnezdenje - vstavljanje zank v zank (tako da lahko zanko v zanki).
Ker seznami uporabljajo presledke kot ločila - to pomeni, da prostor pomeni premik na naslednji element v seznamu - datoteke, ki imajo presledke v imenu, niso zelo prijazne. Za zdaj se držimo dela z datotekami brez presledkov. Začnimo s preprostim skriptom za prikaz imen datotek v trenutnem imeniku. Ustvarite nov skript v mapi ~ / bin / z imenom “loopscript”. Če se ne spomnite, kako to storite (vključno z označevanjem kot izvršljivim in dodajanjem heš bang hack), si oglejte naš članek bash skriptne osnove.
V njej vnesite naslednjo kodo:
za i v točki 1, točka 2, točka 3, točka 5, točka 6; narediti
odmev "$ i"
Končano
Ko zaženete skript, morate te elemente seznama dobiti kot izhodne.
Precej preprosto, kajne? Poglejmo, kaj se zgodi, če malo spremenimo stvari. Spremenite svoj skript tako, da bo to napisal:
za i in *; narediti
odmev "$ i"
Končano
Ko zaženete ta skript v mapi, dobite seznam datotek, ki jih vsebuje kot izhod.
Zdaj pa spremenite ukaz echo v nekaj bolj uporabnega - recimo ukaz zip. Datoteke bomo dodali v arhiv. In dobimo nekaj argumentov v mešanici!
za i v $ @; narediti
arhiv zip »$ i«
Končano
Nekaj novega je! »$ @« Je bližnjica za »$ 1 $ 2 $ 3… $ n«. Z drugimi besedami, to je celoten seznam vseh argumentov, ki ste jih navedli. Zdaj pa si oglejte, kaj se zgodi, ko zaženem skript z več vhodnimi datotekami.
Ogledate si lahko, katere datoteke so v moji mapi. Ukaz sem zagnal s šestimi argumenti in vsaka datoteka je bila dodana v arhiv z arhivom z imenom "archive.zip". Počasi, prav?
Za zanke so precej čudoviti. Sedaj lahko izvajate paketne funkcije na seznamih datotek. Na primer, lahko kopirate vse argumente skripta v arhiv z zadrgo, premaknete izvirnike v drugo mapo in samodejno zaščitite kopijo datoteke zip na oddaljeni računalnik. Če nastavite ključne datoteke s SSH, vam ni treba vnesti gesla, skriptu pa lahko celo povedo, da po prenosu datoteke zip izbriše.!
Z uporabo for-loops lahko preprosto naredite veliko dejanj za vse datoteke v imeniku. Različne ukaze lahko združite skupaj in zlahka uporabite argumente, da ustvarite in vnesete seznam, in to je le vrh ledene gore..
Bash skriptarji, ali imate kakšne predloge? Ste ustvarili uporaben skript, ki uporablja zanke? Želite deliti svoje misli o seriji? Pustite nekaj komentarjev in pomagajte drugim skriptom!