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