Aloittelijan opas Shell Scripting 2: lle silmukoille

Sisällysluettelo:

Aloittelijan opas Shell Scripting 2: lle silmukoille
Aloittelijan opas Shell Scripting 2: lle silmukoille

Video: Aloittelijan opas Shell Scripting 2: lle silmukoille

Video: Aloittelijan opas Shell Scripting 2: lle silmukoille
Video: CS50 2013 - Week 9, continued - YouTube 2024, Maaliskuu
Anonim
Jos haluat rakentaa geek-uskottomasi, liitä meidät toiselle erälle komentosarja-sarjassamme. Meillä on muutamia korjauksia, muutamia parannuksia viime viikon käsikirjoitukseen ja oppaamme silmukan irrottamattomuudesta.
Jos haluat rakentaa geek-uskottomasi, liitä meidät toiselle erälle komentosarja-sarjassamme. Meillä on muutamia korjauksia, muutamia parannuksia viime viikon käsikirjoitukseen ja oppaamme silmukan irrottamattomuudesta.

Datecp-skripti tarkistetaan

Kuori komentosarjojen oppaan ensimmäisessä osassa teimme skriptin, joka kopioi tiedoston varmuuskopiohakemistoon sen jälkeen, kun päiväys oli yhdistetty tiedostonimen loppuun.

Samuel Dionne-Riel huomautti huomautuksissaan, että on paljon parempi tapa käsitellä muuttuvia viitteitämme.

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

toimii niin kauan kuin laajennetuilla muuttujilla ei ole välilyöntejä. Jos soitat käsikirjoituksesi tällä tavalla:

datecp 'my old name' 'my new name'

laajennus johtaa seuraaviin komentoihin:

cp my new name my old name.the_date

joka todellisuudessa on 6 argumenttia.

Tämän ongelman ratkaisemiseksi komentosarjan viimeisen rivin pitäisi olla:

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

Kuten näette, komentosarjan rivin muuttaminen:

cp -iv $1 $2.$date_formatted

että:

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

huolehtii tästä ongelmasta, kun käytetään komentosarjaa tiedostoissa, joilla on välilyöntejä nimessä. Samuel huomauttaa myös, että kopioimalla ja liittämällä koodi tästä sivustosta (tai internetistä yleensä) muista korvata oikeat viivat ja lainausmerkit "typografisesti paremmille", jotka usein korvaavat ne. Teemme vielä enemmän varmistaaksemme, että koodimme on kopioi / liitä ystävällisempi.;-)

Toinen kommentaattori Myles Braithwaite päätti laajentaa komentojamme niin, että päivämäärä ilmestyy ennen tiedoston laajennusta. Joten sen sijasta

tastyfile.mp3.07_14_11-12.34.56

saisimme tämän:

tastyfile.07_14_11-12.34.56.mp3

joka päättyy hieman helpompaa useimmille käyttäjille. Hänen koodinsa on saatavilla hänen GitHub -sivullaan. Katsotaanpa, mitä hän käyttää erottaa tiedostonimi.

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 muuttanut muotoilua hieman, mutta näet, että Myles ilmoittaa päivämääräfunktionsa rivillä 1. Viivassa 2 hän kuitenkin käyttää "echo" -komentoa komentosarjan ensimmäisellä argumentilla tiedostonimen tuottamiseksi. Hän käyttää putkikomentoa ottamaan tuotoksen ja käyttämään sitä tulevana osana. Putken jälkeen Myles kutsuu "awk" -komennon, joka on voimakas kuvion skannausohjelma. Käyttämällä -F-lippua hän kertoo komennolle, että seuraava merkki (tilan jälkeen) on määritellä "kentänerotin". Tässä tapauksessa kyseessä on aika.

Nyt näet tiedoston "tastyfile.mp3", joka koostuu kahdesta kentästä: "tastyfile" ja "mp3". Lopuksi hän käyttää

‘{print $NF}’

näyttämään viimeisen kentän. Jos tiedostossasi on useita jaksoja - jolloin awk näyttää useita kenttiä - se näyttää vain viimeisen, joka on tiedostopääte.

Rivillä 3 hän luo uuden muuttujan tiedoston nimen ja käyttää "basename" -komentoa viittaamaan kaikkiin $ 1: een paitsi tiedostopääte. Tämä tehdään käyttämällä alunimeä ja antamalla sille $ 1 argumenttina, lisäten sitten tilaa ja tiedostopääte. Tiedostopääte lisätään automaattisesti sen muuttujan vuoksi, joka viittaa rivillä 2. Mitä tämä tekee

tastyfile.mp3

ja käännä se

tastyfile

Sitten viimeisellä rivillä Myles koonnut komennon, joka tuottaa kaiken järjestyksessä. Huomaa, että ei ole viittausta $ 2: een, toinen käsikirjoituksen argumentti. Tämä erityisesti skripti kopioi tiedoston nykyiseen hakemistoonsa. Hyvä työ Samuel ja Myles!

Running Scripts ja $ PATH

Mainitsemme perusasiakirjamme myös, että komentosarjoja ei saa käyttää oletusarvoisesti komennoiksi. Eli sinun on osoitettava komentosarjan polkua sen suorittamiseksi:

./script

~/bin/script

Mutta asettamalla skripteesi ~ / bin /: iin, voit vain kirjoittaa heidän nimensä mistä tahansa, jotta heidät voidaan suorittaa.

Kommentoijat viettivät aikaa keskustellakseen siitä, kuinka oikein tämä oli, sillä nykyaikainen Linux distro ei luo kyseistä hakemistoa oletuksena. Lisäksi kukaan ei lisää sitä oletusarvoisesti $ PATH-muuttujaan, mikä on se, mikä edellyttää, että komentosarjat toimivat kuten komentoja. Olin hieman hämmentynyt, koska tarkistuksen jälkeen $ PATH-muuttujaani kommentaattorit olivat oikeita, mutta soittokäsikirjoitukset toimivat edelleen minulle. Selvin, miksi: monet nykyaikaiset Linux-doksit luovat erityisen tiedoston käyttäjän kotihakemistoon -.profile.

Tätä tiedostoa lukee bash (paitsi jos.bash profile on läsnä käyttäjän kotihakemistossa) ja alareunassa on osa, joka lisää ~ / bin / kansion $ PATH-muuttujaan, jos se on olemassa. Joten se mysteeri selvitetään. Jäljellemme sarjasta jatkamme komentojen kirjoittamista ~ / bin / -hakemistoon, koska ne ovat käyttäjäkäsikirjoituksia, ja käyttäjien pitäisi pystyä käsittelemään niitä. Ja näyttää siltä, että emme todellakaan tarvitse sotkea $ PATH-muuttujaa käsin saadaksesi asiat toimimaan.
Tätä tiedostoa lukee bash (paitsi jos.bash profile on läsnä käyttäjän kotihakemistossa) ja alareunassa on osa, joka lisää ~ / bin / kansion $ PATH-muuttujaan, jos se on olemassa. Joten se mysteeri selvitetään. Jäljellemme sarjasta jatkamme komentojen kirjoittamista ~ / bin / -hakemistoon, koska ne ovat käyttäjäkäsikirjoituksia, ja käyttäjien pitäisi pystyä käsittelemään niitä. Ja näyttää siltä, että emme todellakaan tarvitse sotkea $ PATH-muuttujaa käsin saadaksesi asiat toimimaan.

Toistuvat komennot silmukoilla

Päästäkää yksi hyödyllisimmistä työkaluista geek-arsenalissa käsittelemään toistuvia tehtäviä: silmukoita. Tänään keskustelemme "for" -silmukoista.

For-loopin perusviitekehys on seuraava:

for VARIABLE in LIST; do command1 command2 … commandn done

VARIABLE voi olla mikä tahansa muuttuja, mutta useimmiten pienikokoinen "i" käytetään yleissopimuksessa. LUETTELO on luettelo kohteista; voit määrittää useita kohteita (erottamalla ne välilyönnillä), viitata ulkoiseen tekstitiedostoon tai käyttää tähdellä (*) mitä tahansa tiedostoa nykyisessä hakemistossa. Mainitut komennot on sisennetty yleiskokouksessa, joten on helpompi nähdä pesimistä - asettamalla silmukoita silmukoihin (joten voit silmukoida silmukan aikana).

Koska luettelot käyttävät välilyöntejä rajaajina - eli tilaa tarkoittaa siirtymistä seuraavaan kohteen luetteloon - tiedostot, joilla on välilyöntejä, eivät ole kovin ystävällisiä. Seuraavaksi pidetään kiinni työskentelystä tiedostoilla, joilla ei ole välilyöntejä. Aloita yksinkertaisella komentosarjalla, joka näyttää nykyisten hakemistojen tiedostojen nimet. Luo uusi käsikirja ~ / bin / kansioon, jonka otsikko on "loopscript". Jos et muista, miten tämä tehdään (mukaan lukien merkitseminen se suoritettavaksi ja lisätään hash bang -hakua), katso meidän bash-komentosarjan perusasiakirjaa.

Kirjoita siihen seuraava koodi:

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

Kun suoritat käsikirjoituksen, sinun pitäisi vain saada nämä listan kohteet tuotokseksi.
Kun suoritat käsikirjoituksen, sinun pitäisi vain saada nämä listan kohteet tuotokseksi.
Melko yksinkertainen, eikö? Katsotaan, mitä tapahtuu, jos muutat asioita hieman. Muuta käsikirjoitustasi seuraavasti:
Melko yksinkertainen, eikö? Katsotaan, mitä tapahtuu, jos muutat asioita hieman. Muuta käsikirjoitustasi seuraavasti:

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

Kun suoritat tämän komentosarjan kansioon, saat luettelon tiedostoista, jotka se sisältää.
Kun suoritat tämän komentosarjan kansioon, saat luettelon tiedostoista, jotka se sisältää.
Vaihdetaan echo-komento jotain hyödyllisemmäksi - sanoa zip-komento. Nimittäin lisätään tiedostoja arkistoon. Ja saamme muutamia argumentteja sekoituksessa!
Vaihdetaan echo-komento jotain hyödyllisemmäksi - sanoa zip-komento. Nimittäin lisätään tiedostoja arkistoon. Ja saamme muutamia argumentteja sekoituksessa!

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

On jotain uutta! "$ @" On pikakuvake "$ 1 $ 2 $ 3 … $ n". Toisin sanoen se on täydellinen luettelo kaikista määritetyistä argumentteista. Katsokaa nyt, mitä tapahtuu, kun käsittelen komentosarjaa useilla tulosatiedostoilla.
On jotain uutta! "$ @" On pikakuvake "$ 1 $ 2 $ 3 … $ n". Toisin sanoen se on täydellinen luettelo kaikista määritetyistä argumentteista. Katsokaa nyt, mitä tapahtuu, kun käsittelen komentosarjaa useilla tulosatiedostoilla.
Voit nähdä, mitkä tiedostot ovat minun kansioissani. Ohjain komennon kuudella argumentilla, ja jokainen tiedosto lisättiin zip-arkistoon nimeltä "archive.zip". Helppo, eikö?
Voit nähdä, mitkä tiedostot ovat minun kansioissani. Ohjain komennon kuudella argumentilla, ja jokainen tiedosto lisättiin zip-arkistoon nimeltä "archive.zip". Helppo, eikö?

Silmukat ovat ihan upeita. Nyt voit suorittaa erätoimintoja tiedostoista. Voit esimerkiksi kopioida kaikki skriptisi argumentit zip-arkistoon, siirtää alkuperäiset toiseen kansioon ja varmuuskopioida automaattisesti zip-tiedoston kopioi etätietokoneeseen. Jos määrität tärkeät tiedostot SSH: lla, sinun ei tarvitse edes kirjoittaa salasanaasi, ja voit jopa kertoa komentosarjasta poistamalla zip-tiedoston sen lataamisen jälkeen!

For-silmukoiden avulla on helppo tehdä joukko toimia kaikkien hakemiston tiedostojen kohdalla. Voit pinoa monenlaisia komentoja ja käyttää argumentteja erittäin helposti luodaksesi ja lennettävälle luettelolle, ja tämä on vain jäävuoren kärki.

Bash-kirjoittajat, sinulla on ehdotuksia? Oletko tehnyt hyödyllisen komentosarjan, joka käyttää silmukoita? Haluatko jakaa teille ajatuksia sarjasta? Jätä muutamia kommentteja ja auttakaa muita skriptejä aloittelijoille!

Suositeltava: