Homepage » hogyan kell » A kezdő útmutató a Shell parancsfájlokhoz 2 a hurkok számára

    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!