Shell-skriptimise algaja juhend 2: silmuste jaoks

Sisukord:

Shell-skriptimise algaja juhend 2: silmuste jaoks
Shell-skriptimise algaja juhend 2: silmuste jaoks

Video: Shell-skriptimise algaja juhend 2: silmuste jaoks

Video: Shell-skriptimise algaja juhend 2: silmuste jaoks
Video: 3 Abandoned Churches in Detroit: The Pastor's Tragic Death Story - YouTube 2024, Aprill
Anonim
Kui soovite oma geek credi üles ehitada, liitu meiega teise osamaksega meie shelli skriptide sarjas. Meil on mõni parandus, eelmise nädala skripti mõni parandamine ja juhiste loendamise juhend.
Kui soovite oma geek credi üles ehitada, liitu meiega teise osamaksega meie shelli skriptide sarjas. Meil on mõni parandus, eelmise nädala skripti mõni parandamine ja juhiste loendamise juhend.

Datecp skripti uuesti

Meie shelli skriptikäsi esimeses osana tegi me skripti, mis kopeeris faili varukataloogi, lisades faili lõppu kuupäeva.

Samuel Dionne-Riel märkis märkustes, et meie muutuja viited on palju paremad.

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

töötab nii nagu see on ette nähtud seni, kuni laiendatud muutujad neil pole tühikuid. Kui helistate oma skriptile sel viisil:

datecp 'my old name' 'my new name'

laienemine toob kaasa selle käsu:

cp my new name my old name.the_date

millel on tegelikult 6 argumenti.

Selle probleemi korralikuks lahendamiseks peaks skripti viimane rida olema:

cp '$1' '$2.$date_formatted'

Nagu näete, muutub meie skripti joon järgmiselt:

cp -iv $1 $2.$date_formatted

:

cp -iv “$1” “$2”.$date_formatted

hoolitseb selle probleemi eest, kui kasutate skripti failides, mille nimele on tühikud. Samuel juhib tähelepanu ka sellele, et kui koodi kopeerimine ja kleepimine sellelt saidilt (või internetist üldiselt) kindlasti asendab need "sageli tüpograafiliselt paremad" kriipsud ja hinnapakkumised, mis neid tihti asendavad. Samuti teeme rohkem, et veenduda, et kood on rohkem koopia / kleepige sõbralik.;-)

Teine kommentaar, Myles Braithwaite, otsustas laiendada oma skripti nii, et kuupäev kuvatakse enne faililaiendit. Nii asemel

tastyfile.mp3.07_14_11-12.34.56

me saame seda:

tastyfile.07_14_11-12.34.56.mp3

mis lõpuks on enamiku kasutajate jaoks veidi mugavam. Tema kood on saadaval tema GitHubi lehel. Vaatame, mida ta kasutab failinime lahutamiseks.

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

Olen veidi muutnud vormingut, kuid võite näha, et Myles deklareerib oma kuupäeva funktsiooni 1. reas. Rida 2 aga kasutab ta faili nime väljastamiseks käsuga "echo" esimest skripti argumenti. Ta kasutab toru käsu, et seda väljundit võtta ja kasutada seda järgmise osa sisendina. Pärast toru kutsub Myles käsuga awk, mis on võimas mustri skaneerimisprogramm. -F-i lippu kasutades ütleb ta käsklusele, et järgmine tähemärk (pärast tühikut) määratleb väljade eraldaja. Sel juhul on see periood.

Nüüd avas awk faili nimega tastyfile.mp3, mis koosnes kahest väljast: "tastyfile" ja "mp3". Lõpuks kasutab ta

‘{print $NF}’

viimase välja nägemiseks. Juhul, kui teie failil on mitu perioodi - see tähendab, et awk vaatab mitut välju, kuvatakse see ainult viimati, mis on faililaiend.

3. reas loob ta faili nime jaoks uue muutuja ja kasutab käsku "basename", et viidata kõigile $ 1-le välja arvatud faililaiend. Seda tehakse, kasutades basenameet ja annab selle argumendina $ 1, siis lisatakse tühik ja faililaiend. Faililaiend lisatakse automaatselt muutujaga, mis viitab 2. rida. See, mida see teha, on võtta

tastyfile.mp3

ja pööra selle sisse

tastyfile

Viimase rea järel pani Myles kokku käsu, mis väljundiks kõik. Pange tähele, et puudub viide skriti teisele argumendile $ 2. See konkreetne skript kopeerib faili oma praegusesse kataloogi. Suurepärane töö Samuel ja Myles!

Skriptide käitamine ja $ PATH

Me mainime ka oma Basicsi artiklis, et skripte ei tohi vaikimisi kasutada käskudeks. See tähendab, et selle käivitamiseks peate viitama skripti teele:

./script

~/bin/script

Kui aga oma skripte paned ~ / bin / -sse, võite lihtsalt sisestada nende nimed kõikjalt, et need saaksid käivituda.

Kommentaarid mõnda aega arutasid, kui õige see oli, kuna ükski kaasaegne Linuxi distributsioon vaikimisi seda kataloogi loob. Pealegi ei lisata seda vaikimisi $ PATH-i muutuja juurde, mis on vajalik skriptide käitamise käivitamiseks. Ma olin natuke hämmingus, sest pärast $ PATHi muutuja kontrollimist olid kommentaaridel õiged, kuid skriptide saatmine mulle veel töötas. Ma sain aru, miks: paljud kaasaegsed Linuxi distributsioonid loovad kasutaja kodukataloogis -.profiil erifaili.

Seda faili loeb bash (välja arvatud juhul, kui.bash profile asub kasutaja kodukataloogis) ja alt on osa, mis lisab $ PATH-i muutuja ~ / bin / kausta, kui see on olemas. Niisiis, see saladus on lahendatud. Ülejäänud sarja puhul jätkan skriptide paigutamist kataloogi ~ / bin / directory, kuna need on kasutaja skriptid ja kasutajatel peaks olema võimalus neid käitada. Ja tundub, et me ei pea korralikult muutma $ PATH muutujaga, et asjad töötaksid.
Seda faili loeb bash (välja arvatud juhul, kui.bash profile asub kasutaja kodukataloogis) ja alt on osa, mis lisab $ PATH-i muutuja ~ / bin / kausta, kui see on olemas. Niisiis, see saladus on lahendatud. Ülejäänud sarja puhul jätkan skriptide paigutamist kataloogi ~ / bin / directory, kuna need on kasutaja skriptid ja kasutajatel peaks olema võimalus neid käitada. Ja tundub, et me ei pea korralikult muutma $ PATH muutujaga, et asjad töötaksid.

Loopidega käskude kordamine

Vaatame korduvaid ülesandeid tegevate geekide arsenali üheks kõige kasulikumateks tööriistadeks: silmad. Täna arutame "silmuste" jaoks.

For-loopi põhijooned on järgmised:

for VARIABLE in LIST; do command1 command2 … commandn done

VARIABLE võib olla ükskõik milline muutuja, kuigi enamasti kasutatakse väiketähti "i" tavapäraselt. LIST on üksuste loend; võite määrata mitu elementi (eraldades need tühikuga), suunata välisele tekstifailile või kasutada tärniga (*), et tähistada mis tahes faili praeguses kataloogis. Loetletud käsklused on järjestatud üksteise järel, seega on kergem näha pesastamist - silmuseid silmas pidades (nii et saate silmuse ajal loopida).

Kuna loendid kasutavad tühikuid kui tühimikke, st tühik tähendab loendis järgmise elemendi liigutamist - nimes olevad ruumid ei ole väga sõbralikud. Praegu jääme tööle ilma tühikuteta failidesse. Alustame lihtsa skriptiga, et kuvada praeguses kataloogis failide nimesid. Loo uus skript oma ~ / bin / kausta pealkirjaga "loopscript". Kui te ei mäleta, kuidas seda teha (sh märgistada seda käivitatavana ja lisada räsihunnikut), lugege meie bash-skripti põhitõdesid.

Selle sisestage järgmine kood:

for i in item1 item2 item3 item4 item5 item6; do echo “$i” done

Kui käitate skripti, peaksite lihtsalt saama need loendiüksused väljundiks.
Kui käitate skripti, peaksite lihtsalt saama need loendiüksused väljundiks.
Päris lihtne, eks? Vaatame, mis juhtub, kui muudame asju natuke. Muutke oma skripti, nii et see ütleb seda:
Päris lihtne, eks? Vaatame, mis juhtub, kui muudame asju natuke. Muutke oma skripti, nii et see ütleb seda:

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

Kui käidate selle skripti kaustas, peaksite saama failide nimekirja, mida see sisaldab väljundina.
Kui käidate selle skripti kaustas, peaksite saama failide nimekirja, mida see sisaldab väljundina.
Vaatame nüüd kaja käsku midagi kasulikumaks - näiteks zip-käsk. Nimelt lisame faile arhiivi. Ja laseme segust mõned argumendid!
Vaatame nüüd kaja käsku midagi kasulikumaks - näiteks zip-käsk. Nimelt lisame faile arhiivi. Ja laseme segust mõned argumendid!

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

Seal on midagi uut! "$ @" On otsetee "$ 1 $ 2 $ 3 … $ n". Teisisõnu, see on kõikide loetletud argumentide täielik nimekiri. Nüüd vaata, mis juhtub, kui käivitan skripti mitme sisendfailiga.
Seal on midagi uut! "$ @" On otsetee "$ 1 $ 2 $ 3 … $ n". Teisisõnu, see on kõikide loetletud argumentide täielik nimekiri. Nüüd vaata, mis juhtub, kui käivitan skripti mitme sisendfailiga.
Näete, millised failid on minu kaustas. Käisin käsuga kuue argumendiga ja iga fail lisati zipitud arhiivi nimega "archive.zip". Lihtne, eks?
Näete, millised failid on minu kaustas. Käisin käsuga kuue argumendiga ja iga fail lisati zipitud arhiivi nimega "archive.zip". Lihtne, eks?

Silmuste jaoks on päris imeline. Nüüd saate failide loendites partitsioone funktsioone täita. Näiteks võite kopeerida kõik oma skripti argumendid zipitud arhiivist, teisaldada originaale teise kausta ja automaatselt kopeerida selle zip-faili kaugarvutisse. Kui määrate SSH-ga võtmefailid, ei pea te isegi parooli sisestama ja võite isegi pärast skripti üleslaadimist zip-faili kustutada!

For-loopide kasutamine võimaldab kataloogide kõikide failide jaoks hõlpsasti tegutseda. Saate kokku panna mitmesuguseid käske kokku ja kasutama argumente hõlpsasti, et luua ja lennata nimekirjas, ja see on ainult jäämäe tipp.

Bash kirjanikud, kas teil on ettepanekuid? Kas olete loonud kasulikke skripte? Kas soovite jagada oma mõtteid seeria kohta? Jäta mõned kommentaarid ja aitaks teisi skripti uusi kasutajaid välja panna!

Soovitan: