If-Koubou

Shell Scripting 2. iesācēju rokasgrāmata: cilpas

Shell Scripting 2. iesācēju rokasgrāmata: cilpas (Kā)

Ja jūs vēlaties izveidot savu geek cred, pievienojies mums otrajai daļai mūsu čaulas skriptu sērijās. Mums ir daži labojumi, daži uzlabojumi pagājušās nedēļas skriptā un rokasgrāmata par loģiku nezināmiem.

Datcp skripts ir pārskatīts

Pirmajā mūsu čaulas skriptu rokasgrāmatas daļā mēs izveidojām skriptu, kurš kopēja failu dublējuma direktorijā, pievienojot datumu līdz 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.

Argumenti ir bāzu čaulā atdalīti ar atstarpi, un tas tiks iezīmēts, ja rezultāta izvērstajā komandā ir atstarpe. Jūsu skriptā cp $ 1 $ 2. $ date_formatted darbosies tā, kā paredzēts, kamēr paplašinātajiem mainīgajiem nav atstarpju. Ja jūs izsaucat savu skriptu šādā veidā: datecp "mans vecais vārds" "mans jauns vārds" paplašināšana radīs šo komandu: cp mans jaunais vārds mans vecais name.the_date 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 līniju no:

cp -iv $ 1 $ 2. $ date_formatted

uz:

cp -iv "$ 1" "$ 2". $ date_formatted

rūpēsies par šo problēmu, lietojot skriptu failiem, kuru nosaukumos ir atstarpes. Samuels arī norāda, ka, kopējot un ielīmējot kodu no šīs vietnes (vai internetā kopumā), noteikti jāaizstāj pareizie defekti un pēdiņas tiem "tipogrāfiski labākajiem", kas tos bieži aizstāj. Mēs arī darīsim vairāk, lai pārliecinātos, ka mūsu kods ir vairāk kopēt / ielīmēt draudzīgi. ;-)

Vēl viens komentētājs Myles Braithwaite nolēma paplašināt mūsu skriptu, lai datums tiktu parādīts pirms faila paplašinājuma. Tā vietā, lai

tastyfile.mp3.07_14_11-12.34.56

mēs to saņemtu:

tastyfile.07_14_11-12.34.56.mp3

kas galu galā ir nedaudz ērtāk vairumam lietotāju. Viņa kods ir pieejams viņa GitHub lapā. Apskatīsim, ko viņš izmanto, lai izvilktu filename.

date_formatted = $ (datums +% 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

Esmu mainījis formatējumu nedaudz, bet jūs varat redzēt, ka Myles deklarē datuma funkciju 1. rindiņā. Tomēr 2. rindiņā viņš izmanto "echo" komandu ar pirmo skripta argumentu, lai izsniegtu faila nosaukumu. Viņš izmanto cauruļu komandu, lai ņemtu šo rezultātu un izmantotu to kā ieeju nākamajai daļai. Pēc caurules Myles pieprasa "awk" komandu, kas ir spēcīga parauga skenēšanas programma. Izmantojot -F karodziņu, viņš paziņo komandai, ka nākamais raksturs (pēc atstarpes) ir tas, kas definēs "lauku atdalītāju". Šajā gadījumā tas ir periods.

Tagad, awk, failu ar nosaukumu "tastyfile.mp3" uzskata par 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 redzams vairākos laukos, tas parādīs tikai pēdējo, kas ir faila paplašinājums.

3. rindiņā viņš izveido jaunu mainīgo faila nosaukumam un izmanto komandu "basename", lai norādītu viss par $ 1 izņemot faila paplašinājums. Tas tiek darīts, izmantojot basename un piešķirt tam $ 1 par savu argumentu, pēc tam pievienojot atstarpi un faila paplašinājumu. Faila paplašinājums tiek automātiski pievienots tādēļ, ka mainās ar atsaucēm uz 2. līniju. Tas, ko tas izdarīs, ir veikt

tastyfile.mp3

un pārvērst to

tastyfile

Tad pēdējā rindiņā Myles izveido komandu, kas izvadīs viss kārtībā. Ņemiet vērā, ka nav atsauces uz $ 2, otro argumentu par skriptu. Šis konkrētais skripts kopē minētos failus savā pašreizējā direktorijā. Lielisks darbs Samuelam un Myles!

Skriptu izpilde un $ PATH

Mēs arī pieminējām mūsu pamati rakstā, ka skriptus pēc noklusējuma nedrīkst atsaukties kā komandas. Tas nozīmē, ka, lai to izpildītu, jums jāuzraksta skripta ceļš:

./script

~ / bin / skripts

Bet, ievietojot savus skriptus ~ / bin /, jūs varat vienkārši ierakstīt savus vārdus no jebkuras vietas, lai tos varētu palaist.

Komentētāji ilgu laiku apspriedās par to, cik tas bija pareizi, jo neviens mūsdienu Linux distribūst pēc noklusējuma šo direktoriju izveido. Turklāt neviens nepievieno to $ PATH mainīgajam pēc noklusējuma, un tas ir tas, kas nepieciešams, lai skripti tiktu izpildīti, piemēram, komandas. Es biju mazliet satraukts, jo pēc tam, kad esmu pārbaudījis savu $ PATH mainīgo, komentētāji bija pareizi, bet zvana skripti joprojām man darbojās. Es uzzināju, kāpēc: daudzi mūsdienu Linux distros izveido īpašu failu lietotāja mājas direktorijā - .profilā.

Šis fails tiek lasīts ar bash (ja vien .bash_profile nav lietotāja mājas direktorijā) un apakšā, tur ir sadaļa, kas pievieno ~ / bin / mapi $ PATH mainīgajam, ja tā ir. Tātad, šis noslēpums ir noskaidrots. Pārējo sēriju dēļ es turpinu ievietot skriptus ~ / bin / direktorijā, jo tie ir lietotāja skripti, un tiem vajadzētu būt iespējai vadīt lietotāji. Un, šķiet, ka mums patiešām nav jāmirst ar mainīgo $ PATH ar roku, lai lietas darbotos.

Atkārtotas komandas ar cilpām

Let's get uz vienu no visnoderīgākajiem instrumentiem geek arsenal, lai risinātu ar atkārtojošos uzdevumus: cilpas. Šodien mēs apspriedīsim "par" cilpām.

Pamata kontūras for-loop ir šāds:

par VARIABLE sarakstā; dari
komanda1
command2

komandēt
pabeigts

VARIABLE var būt jebkurš mainīgais, lai gan visbiežāk tiek lietots mazais "i". SARAKSTS ir priekšmetu saraksts; varat norādīt vairākus vienumus (atdalot tos ar atstarpi), norādiet uz ārējo teksta failu vai izmantojiet zvaigznīti (*), lai norādītu jebkuru failu pašreizējā direktorijā. Norādītās komandas ir atdalītas pēc vienošanās, tāpēc ir vieglāk redzēt ligzdošanu - cilpas cilpas (lai jūs varētu cilpa, kamēr jūs cilpa).

Tā kā saraksti izmanto atstarpes kā norobežotājus, tas nozīmē, ka atstarojums nozīmē pāriet uz nākamo vienumu sarakstā - faili, kuriem vārdam ir atstarpes, nav ļoti draudzīgi. Tagad mēs turpināsim strādāt ar failiem bez atstarpēm. Sāksim ar vienkāršu skriptu, lai parādītu pašreizējo direktoriju failu nosaukumus. Izveidojiet jaunu skriptu savā ~ / bin / mapē ar nosaukumu "loopscript". Ja jūs neatcerosit, kā to izdarīt (ieskaitot atzīmi par izpildāmu un pievienojot hash bang hack), skatiet mūsu bash skriptu pamatu rakstu.

Tajā ievadiet šādu kodu:

attiecībā uz i 1. postenis 2. postenis 3. postenis 4. postenis 5. postenis6; dari
echo "$ i"
pabeigts

Kad palaižat skriptu, jums vajadzētu vienkārši iegūt šos saraksta vienumus kā izlaidi.

Diezgan vienkārši, vai ne? Apskatīsim, kas notiek, ja mazliet mainīsim. Mainiet savu skriptu, lai tas būtu šāds:

par i in *; dari
echo "$ i"
pabeigts

Kad jūs palaidat šo skriptu mapē, jums vajadzētu saņemt sarakstu ar failiem, kurus tā satur kā izlaidi.

Tagad mainīsim echo komandu kaut ko vairāk noderīgu - teiksim, zip komandu. Proti, mēs pievienosim failus arhīvā. Un, pieņemsim iegūt dažus argumentus mix!

par i $ @; dari
zip arhīvs "$ i"
pabeigts

Tur ir kaut kas jauns! "$ @" Ir saīsne "$ 1 $ 2 $ 3 ... $ n". Citiem vārdiem sakot, tas ir pilns ar visiem norādītajiem argumentiem. Tagad skatīties, kas notiek, kad es palaistu skriptu ar vairākiem ievades failiem.

Jūs varat redzēt, kuri faili ir manā mapē. Es vadīju komandu ar sešiem argumentiem, un katrs fails tika pievienots zip arhīvam ar nosaukumu "archive.zip". Viegli, vai ne?

Par cilpām ir diezgan brīnišķīgi. Tagad jūs varat izpildīt partijas funkcijas failu sarakstos. Piemēram, jūs varat kopēt visus skripta argumentus zip arhīvā, pārvietot oriģinālus uz citu mapi un automātiski droši kopēt šo zip failu attālajā datorā. Ja jūs izveidojat atslēgu failus ar SSH, jums pat nevajadzēs ievadīt savu paroli, un jūs pat varat pateikt skriptu, lai izdzēstu zip failu pēc tā augšupielādes!

Izmantojot for-cilpas, ir viegli izdarīt virkni darbību visiem direktorijā esošajiem failiem. Jūs varat sakārtot dažādas komandas kopā un ļoti viegli izmantot argumentus, lai izveidotu un sarakstā pieejamu sarakstu, un tas ir tikai aisberga gals.

Bash scripters, vai jums ir kādi ieteikumi? Vai esat veicis noderīgu skriptu, kas izmanto cilpas? Vai vēlaties dalīties ar jums par sērijām? Atstājiet dažus komentārus un palīdziet citiem skriptu iesācējiem!