Iesācēja rokasgrāmata Shell Scripting 2 cilpām
Ja vēlaties veidot savu ģeekredītu, pievienojieties mums otrai daļai mūsu čaulu skriptu sērijā. Mums ir dažas korekcijas, daži uzlabojumi pagājušās nedēļas scenārijā, kā arī rokasgrāmata par neiniciatīviem.
Datecp skripts pārskatīts
Pirmajā mūsu čaulu skriptu rokasgrāmatā mēs izveidojām skriptu, kas kopēja failu rezerves direktorijā pēc datuma pievienošanas faila nosaukuma beigām.
Samuel Dionne-Riel komentāros norādīja, ka ir daudz labāks veids, kā rīkoties ar mūsu mainīgajām atsaucēm.
Arhitekti tiek atdalīti atstarpē bash apvalkā, tas tiks atzīmēts, kad radītajā paplašinātajā komandā ir vieta. Jūsu skriptu,
cp $ 1 $ 2. $ date_formatted
darbosies kā paredzēts, kamēr paplašinātajiem mainīgajiem nav tukšumu. Ja šādā veidā izsaucat skriptu:datecp "mans vecais vārds" "mans jaunais vārds"
paplašinājums radīs šo komandu:mans jaunais vārds mans vecais vārds
kas faktiski ir 6 argumenti.Lai pareizi risinātu šo problēmu, skripta pēdējai rindai jābūt:
cp "$ 1" "$ 2. $ date_formatted"
Kā redzat, mainot mūsu skripta rindu no:
cp -iv $ 1 $ 2. $ date_formatted
uz:
cp -iv “$ 1” “$ 2”. $ date_formatted
rūpēsies par šo problēmu, izmantojot skriptu failos, kuros nosaukumā ir atstarpes. Samuels arī norāda, ka, kopējot un ielīmējot kodu no šīs vietnes (vai internetā), noteikti aizvietojiet pareizos domuzīmes un citātus par “tipogrāfiski labākiem” tiem, kas bieži tos aizstāj. Mēs arī darīsim vairāk, lai pārliecinātos, ka mūsu kods ir vairāk kopēts / ielīmēts draudzīgi. ;-)
Vēl viens komentētājs Myles Braithwaite nolēma paplašināt mūsu skriptu, lai datums parādītos pirms faila paplašinājuma. Tā vietā
tastyfile.mp3.07_14_11-12.34.56
mēs to iegūtu:
tastyfile.07_14_11-12.34.56.mp3
kas beidzas ar mazliet ērtāku vairumam lietotāju. Viņa kods ir pieejams viņa GitHub lapā. Apskatīsim to, ko viņš izmanto, lai izvilktu faila nosaukumu.
date_formatted = $ (datums +% Y-% m-% d_% H.% M% S)
file_extension = $ (atbalss "$ 1" | awk -F. 'print $ NF')
faila nosaukums = $ (basename $ 1. $ file_extension)cp -iv $ 1 $ file_name- $ date_formatted. $ file_extension
Esmu nedaudz mainījis formatējumu, bet jūs varat redzēt, ka Myles paziņo savu datuma funkciju 1. rindā. Tomēr 2. rindā viņš izmanto “echo” komandu ar pirmo skripta argumentu, lai izvadītu faila nosaukumu. Viņš izmanto caurules komandu, lai veiktu šo izeju un izmantotu to kā ievadi nākamajai daļai. Pēc caurules Myles aicina uz “awk” komandu, kas ir spēcīga rakstu skenēšanas programma. Izmantojot -F karogu, viņš stāsta komandai, ka nākamā rakstzīme (pēc atstarpes) ir tas, kas definēs „lauka atdalītāju”. Šajā gadījumā tas ir periods.
Tagad, awk, skatiet failu ar nosaukumu “tastyfile.mp3”, kas sastāv no diviem laukiem: “tastyfile” un “mp3”. Visbeidzot, viņš izmanto
'print $ NF'
lai parādītu pēdējo lauku. Gadījumā, ja jūsu failam ir vairāki periodi - tādējādi awk redzot vairākus laukus - tas parādīs tikai pēdējo, kas ir faila paplašinājums.
3. rindā viņš izveido jaunu faila nosaukuma mainīgo un izmanto “basename” komandu, lai atsauktos uz visu $ 1 izņemot faila paplašinājums. Tas tiek darīts, izmantojot pamata nosaukumu un piešķirot tai argumentu $ 1, tad pievienojot atstarpi un faila paplašinājumu. Faila paplašinājums tiek automātiski pievienots, jo mainās 2. rindas norādes
tastyfile.mp3
un ieslēdziet to
garšīgs
Pēc tam pēdējā rindā Myles apkopoja komandu, kas izvedīs visu kārtībā. Ņemiet vērā, ka nav atsauces uz $ 2, otro argumentu skriptam. Šis konkrētais skripts šo failu kopēs jūsu pašreizējā direktorijā. Lielisks darbs Samuel un Myles!
Skriptu un $ PATH palaišana
Mūsu pamatu rakstā ir norādīts, ka skriptiem nav atļauts atsaukties kā komandas pēc noklusējuma. Tas ir, jums ir jānorāda uz skripta ceļu, lai to palaistu:
./ skripts
~ / bin / skripts
Bet, ievietojot skriptus ~ / bin /, jūs varat vienkārši ierakstīt viņu vārdus no jebkuras vietas, lai tos varētu palaist.
Komentētāji veltīja kādu laiku debatēm par to, kā tas bija pareizi, jo neviena mūsdienīga Linux izplatītāja neizveido šo direktoriju pēc noklusējuma. Turklāt neviens no tiem neiekļauj $ PATH mainīgo pēc noklusējuma, kas ir nepieciešams, lai skriptus varētu palaist kā komandas. Es biju mazliet neizpratnē, jo pēc mana $ PATH mainīgā lieluma pārbaudes komentētāji bija pareizi, bet zvanu skripti joprojām strādāja. Es uzzināju, kāpēc: daudzi mūsdienu Linux domēna vārdi izveido īpašu failu lietotāja mājas direktorijā - .profile.
Šo failu lasa bash (ja .bash_profile nav lietotāja mājas direktorijā) un apakšā ir sadaļa, kas pievieno ~ / bin / mapi $ PATH mainīgajam, ja tā ir. Tātad, šis noslēpums ir noskaidrots. Attiecībā uz pārējo sēriju, es turpināšu ievietot skriptus ~ / bin / direktorijā, jo viņi ir lietotāja skripti, un tiem vajadzētu būt iespējai vadīt lietotājiem. Un, šķiet, mums nav īsti jāsaista ar $ PATH mainīgo ar roku, lai iegūtu lietas.
Atkārtotas komandas ar cilpām
Let's get uz vienu no noderīgākajiem instrumentiem geek arsenāls, lai risinātu atkārtojas uzdevumus: cilpas. Šodien mēs apspriedīsim „par” cilpām.
Galvenais kontūras apraksts ir šāds:
attiecībā uz VARIABLE LIST; darīt
komanda1
komandu2
…
komandēt
izdarīts
VARIABLE var būt jebkurš mainīgais, lai gan visbiežāk mazo burtu “i” izmanto pēc vienošanās. LIST ir vienumu saraksts; jūs varat norādīt vairākus vienumus (atdalot tos ar atstarpi), norādīt uz ārējo teksta failu vai izmantot zvaigznīti (*), lai apzīmētu jebkuru failu pašreizējā direktorijā. Sarakstā iekļautās komandas ir ietvertas pēc konvencijas, tāpēc ir vieglāk redzēt ligzdošanu - cilpas liekot cilpās (lai jūs varētu cilpa, kamēr atrodaties).
Tā kā saraksti izmanto norobežotājus - tas nozīmē, ka telpa nozīmē pāreju uz nākamo saraksta punktu - faili, kuriem ir atstarpes nosaukumā, nav ļoti draudzīgi. Tagad paliksim pie darba ar failiem bez atstarpēm. Sākt ar vienkāršu skriptu, lai parādītu pašreizējā direktorijā esošo failu nosaukumus. Izveidojiet jaunu skriptu savā ~ / bin / mapē ar nosaukumu “loopscript”. Ja jūs neatceraties, kā to izdarīt (tai skaitā atzīmējot to kā izpildāmu un pievienojot hash bang hack), skatiet mūsu bash skriptu pamatu rakstu.
Tajā ievadiet šādu kodu:
par i pozīcijā1 postenis3 postenis4 postenis5 postenis6; darīt
atbalss “$ i”
izdarīts
Kad palaižat skriptu, jums vajadzētu tikai iegūt šos saraksta vienumus kā izeju.
Diezgan vienkārši, vai ne? Redzēsim, kas notiek, ja mēs nedaudz mainīsim lietas. Mainiet savu skriptu tā, lai tas būtu šāds:
i i *; darīt
atbalss “$ i”
izdarīts
Kad palaižat šo skriptu mapē, jums jāiegūst saraksts ar failiem, kas tajā ir izvadīti.
Tagad mainīsim echo komandu par kaut ko vairāk noderīgu - teiksim, zip komandu. Proti, mēs pievienot failus arhīvā. Un, pieņemsim sajaukt dažus argumentus!
par i $ @; darīt
zip arhīvs “$ i”
izdarīts
Ir kaut kas jauns! “$ @” Ir saīsinājums “$ 1 $ 2 $ 3… $ n”. Citiem vārdiem sakot, tas ir visu norādīto argumentu pilns saraksts. Tagad skatieties, kas notiek, kad palaižu skriptu ar vairākiem ievades failiem.
Varat redzēt, kuri faili atrodas manā mapē. Es vadīju komandu ar sešiem argumentiem, un katrs fails tika pievienots zip arhīvam ar nosaukumu “archive.zip”. Viegli, labi?
Par cilpām ir diezgan brīnišķīgi. Tagad jūs varat izpildīt partijas funkcijas failu sarakstos. Piemēram, varat kopēt visus skripta argumentus zip arhīvā, pārvietot oriģinālus uz citu mapi un automātiski nostiprināt zip faila kopiju uz attālo datoru. Ja iestatāt galvenos failus ar SSH, jums pat nav jāievada parole, un jūs pat varat pateikt skriptu, lai izdzēstu zip failu pēc tā augšupielādes!
Izmantojot cilpas, ir viegli veikt virkni darbību visiem direktorijā esošajiem failiem. Varat apvienot dažādas komandas un izmantot viegli argumentus, lai izveidotu un lidotu sarakstu, un tas ir tikai aisberga gals.
Vai jums ir kādi ieteikumi? Vai esat izveidojis noderīgu skriptu, kas izmanto cilpas? Vai vēlaties dalīties savās domās par sēriju? Atstājiet dažas piezīmes un palīdziet citiem skriptu jaunpienācējiem!