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.
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
for i in *; do echo “$i” done
for i in $@; do zip archive “$i” done
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!