A kezdő útmutató a Shell parancsfájlokhoz 2 a hurkok számára
Ha szeretné felépíteni a geek hitelét, csatlakozzon hozzánk a második részhez a shell scripting sorozatunkban. Van néhány korrekciónk, néhány javítás a múlt heti szkripthez, és egy útmutató a hamisítatlanok számára.
A datecp Script Revisited
A shell scripting guide első részletében egy olyan parancsfájlt készítettünk, amely a dátumot a fájlnév végéhez csatolta egy biztonsági másolat könyvtárba..
Samuel Dionne-Riel a megjegyzésekben rámutatott, hogy sokkal jobb módja a változó referenciáink kezelésének.
Argumentumok térközzel vannak elválasztva a bash-héjban, akkor jelződik, ha van egy hely a kapott kiterjesztett parancsban. A parancsfájlban,
cp $ 1 $ 2. $ date_formatted
addig fog működni, amíg a kibővített változók nem rendelkeznek szóközzel. Ha így hívja a parancsfájlt:datecp "régi nevem" "új nevem"
a bővítés ezt a parancsot eredményezi:cp az új nevem a régi nevem
amely valójában 6 érvvel rendelkezik.A probléma helyes kezeléséhez a parancsfájl utolsó sora:
cp "$ 1" "$ 2. $ date_formatted"
Amint láthatod, megváltoztathatod a szkript vonalát:
cp -iv $ 1 $ 2. $ date_formatted
nak nek:
cp -iv “$ 1” “$ 2”. $ date_formatted
gondoskodik erről a problémáról, ha a parancsfájlt olyan fájlokban használja, amelyek szóközzel rendelkeznek a névben. Samuel arra is rámutat, hogy ha az oldalról (vagy általában az internetről) kódot másol és beilleszti, győződjön meg róla, hogy helyettesíti a megfelelő kötőjeleket és idézeteket a „tipográfiailag jobb”, amelyek gyakran helyettesítik őket. Mi is többet fogunk tenni annak érdekében, hogy a kódunk több másolás / beillesztés barátságos legyen. ;-)
Egy másik hozzászóló, Myles Braithwaite úgy döntött, hogy bővíti a szkriptünket, hogy a dátum a fájl kiterjesztése előtt megjelenjen. Tehát ahelyett, hogy
tastyfile.mp3.07_14_11-12.34.56
ezt kapnánk:
tastyfile.07_14_11-12.34.56.mp3
ami a legtöbb felhasználó számára egy kicsit kényelmesebb. A kódja megtalálható a GitHub oldalán. Vessünk egy pillantást arra, amit a fájlnév elválasztására használ.
date_formatted = $ (dátum +% Y-% m-% d_% H.% M% S)
file_extension = $ (echo "$ 1" | awk -F. 'print $ NF')
file_name = $ (alapnév $ 1. $ file_extension)cp -iv $ 1 $ file_name- $ date_formatted. $ file_extension
Egy kicsit megváltoztattam a formázást, de láthatjuk, hogy Myles kijelentette dátumfüggvényét az 1. sorban. A 2. sorban azonban a "echo" parancsot használja a parancsfájl első argumentumával, hogy kiadja a fájl nevét. A csőparancsot használja a kimenet felvételére és a következő rész bevitelére. A cső után Myles felhívja az „awk” parancsot, amely egy erőteljes mintapásztázó program. A -F jelző használatával azt mondja a parancsnak, hogy a következő karakter (egy szóköz után) meghatározza a „mező elválasztót”. Ebben az esetben ez egy időszak.
Most, awk lát egy „tastyfile.mp3” nevű fájlt, amely két mezőből áll: „ízletes” és „mp3”. Végül használja
'print $ NF'
az utolsó mező megjelenítéséhez. Abban az esetben, ha a fájlnak több periódusa van - így az awk több mezőt is láthat - csak az utolsó, amely a fájl kiterjesztése..
A 3. sorban egy új változót hoz létre a fájl nevéhez, és a „basename” parancsot használja, hogy mindent az $ 1-ben hivatkozzon kivéve a fájl kiterjesztése. Ezt úgy végezzük, hogy használjuk a basename-t, és argumentumként megadjuk az $ 1-et, majd hozzáadunk egy szóközt és a fájlkiterjesztést. A fájl kiterjesztése automatikusan hozzáadódik a 2. sorhoz tartozó változó miatt
tastyfile.mp3
és kapcsolja be
tastyfile
Ezután az utolsó sorban Myles összeállította a parancsot, amely mindent rendben rendez. Ne feledje, hogy nincs hivatkozás a $ 2-ra, a második argumentumra a szkript számára. Ez az adott parancsfájl helyett az aktuális könyvtárba másolja a fájlt. Nagy munka Samuel és Myles!
A parancsfájlok és a $ PATH futtatása
Alapvető cikkünkben megemlítjük, hogy a parancsfájlok alapértelmezés szerint nem lehetnek parancsokként hivatkozva. Vagyis a parancsfájl elérési útjára kell mutatnia annak futtatásához:
./forgatókönyv
~ / Bin / script
De ha a parancsfájlokat a ~ / bin / könyvtárba helyezi, bárhonnan csak beírhatja a nevüket, hogy futhassanak.
A hozzászólók egy kis időt vitattak meg arról, hogy ez mennyire volt helyes, mivel egyetlen modern Linux disztribúció sem hoz létre alapértelmezetten ezt a könyvtárat. Továbbá senki sem adja hozzá a $ PATH változóhoz alapértelmezés szerint, ami szükséges ahhoz, hogy a parancsfájlok futtathatók legyenek. Kicsit zavarba ejtettem, mert a $ PATH változójának ellenőrzése után a kommentárok helyesek voltak, de a hívó szkriptek még mindig dolgoztak nekem. Rájöttem, hogy miért: sok modern Linux-terület létrehoz egy speciális fájlt a felhasználó saját könyvtárában - .profile.
Ezt a fájlt a bash leolvassa (kivéve, ha a .bash_profile jelen van a felhasználó otthoni könyvtárában) és alul van egy rész, amely hozzáadja a ~ / bin / mappát a $ PATH változóhoz, ha létezik. Szóval, ez a rejtély megtisztul. A sorozat többi részében a ~ / bin / könyvtárban továbbra is szkriptek kerülnek forgalomba, mert felhasználói szkriptek, és a felhasználóknak képesnek kell lenniük. És úgy tűnik, nem kell igazán elrontani a $ PATH változót kézzel, hogy dolgozzunk.
Ismétlődő parancsok hurokkal
Menjünk a geek arzenál egyik leghasznosabb eszközére az ismétlődő feladatok kezeléséhez: hurkok. Ma megvitatjuk a „for” ciklusokat.
A for-loop alapvető vázlata a következő:
VÁLTOZÁS esetén a LIST; csinál
parancs1
command2
...
parancsn
Kész
A változó bármilyen változó lehet, bár a leggyakrabban az „i” kisbetűt használják az egyezmény. A LIST az elemek listája; több elemet is megadhat (egy szóközzel elválasztva), egy külső szövegfájlra mutathat, vagy csillaggal (*) jelölheti az aktuális könyvtár bármely fájlját. A felsorolt parancsok egyezmények szerint vannak feltüntetve, így könnyebb látni a fészkelést - hurkok elhelyezése hurkokba (így a hurok a hurok közben).
Mivel a listák elválasztóként használják a szóközöket, vagyis a szóközt a lista következő tételére való áthelyezés jelöli - a névben szóközökkel nem rendelkező fájlok nem nagyon barátságosak. Most ragaszkodjunk a szóköz nélküli fájlokhoz. Kezdjük egy egyszerű szkripttel, hogy megjelenítsük az aktuális könyvtárban lévő fájlok nevét. Hozzon létre egy új parancsfájlt a „loopscript” nevű ~ / bin / mappában. Ha nem emlékszik rá, hogyan kell ezt megtennie (beleértve a végrehajthatónak jelölést és a hash bang hack hozzáadását), tekintse meg a bash scripting alapjaink cikkét.
Ebben írja be a következő kódot:
i-re az 1. tétel2 tétel3 tétel4 tétel5 tétel6; csinál
echo “$ i”
Kész
A parancsfájl futtatásakor csak ezeket a listatételeket kell kiadni.
Elég egyszerű, ugye? Lássuk, mi történik, ha kicsit megváltoztatjuk a dolgokat. Módosítsa a szkriptet, így azt mondja:
i esetén *; csinál
echo “$ i”
Kész
Amikor a parancsfájlt egy mappában futtatja, a fájlokat listában kell megjelenítenie.
Most változtassuk meg az echo parancsot valami hasznosabbra - mondjuk a zip parancsra. Nevezetesen, fájlokat adunk egy archívumba. És vegyünk néhány érvet a keverékben!
i esetén a $ @; csinál
zip archívum „$ i”
Kész
Van valami új! A „$ @” egy „$ 1 $ 2 $ 3… $ n” gyorsbillentyű. Más szóval, az összes megadott argumentum teljes listája. Most nézd meg, mi történik, amikor a parancsfájlt több bemeneti fájldal futtatom.
Láthatja, hogy mely fájlok találhatók a mappámban. Hat argumentummal futtattam a parancsot, és minden fájlt hozzáadtam egy „archive.zip” nevű zip archívumhoz. Könnyű, igaz?
A hurkok elég csodálatosak. Most végrehajthatja a kötegelt funkciókat a fájlok listájában. Például az összes szkript argumentumát átmásolhatja egy zipzív archívumba, áthelyezheti az eredetiket egy másik mappába, és automatikusan biztonságosan másolhatja a zip-fájlt egy távoli számítógépre. Ha kulcsfájlokat állít be SSH-val, akkor még nem kell megadnia a jelszavát, és azt is meg tudja mondani a parancsfájlnak, hogy törölje a zip fájlt a feltöltés után!
A for-loops használatával könnyedén végezhet egy csomó műveletet a könyvtár összes fájljához. A parancsok széles választékát egymásra helyezhetjük, és nagyon könnyen használhatunk argumentumokat a repülési lista létrehozásához és a listán való megjelenítéshez, és ez csak a jéghegy csúcsa.
Bash scripterek, van-e javaslata? Készítettél egy hasznos szkriptet, amely hurkot használ? Szeretné megosztani gondolatait a sorozatról? Hagyjon néhány megjegyzést, és segítsen más szkripttel kezdőknek!