A Shell Scripting Beginner's Guide 2: A hurokhoz

Tartalomjegyzék:

A Shell Scripting Beginner's Guide 2: A hurokhoz
A Shell Scripting Beginner's Guide 2: A hurokhoz

Videó: A Shell Scripting Beginner's Guide 2: A hurokhoz

Videó: A Shell Scripting Beginner's Guide 2: A hurokhoz
Videó: Home Assistant. Урок 9.4 ADD-ON - Xiaomi Gateway 3, интеграция в zigbee2mqtt 2024, Április
Anonim
Ha szeretné felépíteni a geek hitelességét, csatlakozzon hozzánk a második példányhoz shell parancssorunkban. Van néhány korrekció, néhány javulás a múlt heti szkripthez, és egy útmutatás a hurokra a nem kezdők számára.
Ha szeretné felépíteni a geek hitelességét, csatlakozzon hozzánk a második példányhoz shell parancssorunkban. Van néhány korrekció, néhány javulás a múlt heti szkripthez, és egy útmutatás a hurokra a nem kezdők számára.

A datecp Script revisited

A shell parancsfájl-útmutató első részletében egy olyan szkriptet készítettünk, amely egy fájlt másolt a biztonsági könyvtárba, miután a dátumot a fájlnév végéhez csatolta.

Samuel Dionne-Riel rámutatott a megjegyzésekben, hogy sokkal jobb mód van a változó referenciáink kezelésére.

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

fog működni, amíg a kibővített változóknak nincs szóközük. Ha a parancsfájl így hívja:

datecp 'my old name' 'my new name'

a terjeszkedés ezt a parancsot eredményezi:

cp my new name my old name.the_date

amely valójában 6 érvvel rendelkezik.

A probléma megfelelő kezeléséhez a szkript legutolsó sorának a következőnek kell lennie:

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

Amint láthatja, a szkript sorának megváltoztatása:

cp -iv $1 $2.$date_formatted

nak nek:

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

gondoskodni fog ezzel a problémával, ha a szkriptet olyan fájlokban használja, amelyeknek szóközök vannak a névben. Sámuel arra is rámutat, hogy amikor kódot másolnak és beillesztenek ezen a webhelyen (vagy általában az interneten), győződjön meg róla, hogy helyettesíti a "tipográfiailag jobb" szövegeket és idézőjeleket, amelyek gyakran helyettesítik őket. Mi is többet teszünk, hogy meggyőződjünk róla, hogy a kód több másolás / beillesztés barátsága.;-)

Egy másik kommentátor, Myles Braithwaite úgy döntött, hogy kibővíti a szkriptet, hogy a dátum megjelenjen a fájlkiterjesztés előtt. Tehát ahelyett, hogy

tastyfile.mp3.07_14_11-12.34.56

ezt kapnánk:

tastyfile.07_14_11-12.34.56.mp3

amely a legtöbb felhasználó számára kényelmesebbé válik. Kódja elérhető a GitHub oldalán. Vessünk egy pillantást arra, amit a fájlnév eltávolítására használ.

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

Egy kicsit megváltoztattam a formázást, de láthatjuk, hogy Myles kijelöli a dátum funkcióját az 1. sorban. A 2. sorban azonban a "echo" parancsot használja a szkript első argumentumával a fájl nevének kiadásához. A csővezetéket használja, hogy ezt a kimenetet használja, és használja a bemenetként a következő részhez. A cső után Myles felhívja az "awk" parancsot, ami egy erőteljes mintázó program. A -F jelző használatával elmondja a parancsnak, hogy a következő karakter (szóköz után) meghatározza a "field separator" -t. Ebben az esetben ez egy időszak.

Most pedig nézd meg a "tastyfile.mp3" nevű fájlt, amely két mezőből áll: "tastyfile" és "mp3". Végül használ

‘{print $NF}’

az utolsó mező megjelenítéséhez. Abban az esetben, ha a fájljának több periódusa van - így az awk több mezőt jelenít meg - csak az utolsóat jeleníti meg, amely a fájl kiterjesztése.

A 3. sorban egy új változót hoz létre a fájl nevére, és a "basename" parancsot használva mindent utal az 1 dollárban kivéve a fájl kiterjesztése. Ezt a bázisnév használatával adjuk meg, és argumentumként 1 dollárt adunk hozzá, majd hozzáadunk egy szóközt és egy fájlkiterjesztést. A fájlkiterjesztés automatikusan hozzáadódik a 2-es sorozathoz tartozó változó miatt. Ez a feladat

tastyfile.mp3

és kapcsolja be

tastyfile

Aztán az utolsó sorban Myles összerakta a parancsot, ami minden rendben lesz. Ne feledje, hogy nincs hivatkozás a $ 2-ra, a második argumentum a szkriptre. Ez a parancsfájl másolja a fájlt az aktuális könyvtárába. Nagy munka Samuel és Myles!

Futtatható parancsfájlok és $ PATH

Említjük az alapokmányunkban azt is, hogy a parancsfájlok alapértelmezés szerint nem hivatkoznak parancsokra. Vagyis a parancsfájl elérési útjára kell mutatnia annak futtatásához:

./script

~/bin/script

De ha a scripteket a ~ / bin / könyvtárba helyezi, akkor csak írhatja be a nevüket bárhonnan, hogy futtassa őket.

A kommentárok töltöttek némi időt arra, hogy megvitassák, mennyire helyes ez, hiszen a modern Linux disztribúció alapértelmezés szerint nem hozza létre ezt a könyvtárat. Ezenkívül senki sem adja hozzá a $ PATH változóhoz alapértelmezésben sem, ami szükséges ahhoz, hogy a parancsfájlokat parancsokként futtassák. Kissé zavarban voltam, mert a $ PATH változó ellenőrzése után a kommentároknak igazuk volt, de a szkriptek hívása még mindig dolgozott nekem. Megtudtam, hogy miért: sok modern Linux disztribúció létrehoz egy speciális fájlt a felhasználó saját könyvtárában -.profile.

Ezt a fájlt bash olvasja (hacsak a.bash profile nincs a felhasználó saját könyvtárában), és alul van egy szakasz, amely hozzáadja a ~ / bin / mappát a $ PATH változóhoz, ha létezik. Szóval ez a rejtély tisztázódik. A sorozat többi részéhez továbbra is a ~ / bin / könyvtárba helyezem a szkripteket, mert felhasználói szkriptek, és azokat a felhasználóknak kell futtatniuk. És úgy tűnik, hogy nem kell a $ PATH változót kézzel elrontani, hogy dolgokat dolgozzunk.
Ezt a fájlt bash olvasja (hacsak a.bash profile nincs a felhasználó saját könyvtárában), és alul van egy szakasz, amely hozzáadja a ~ / bin / mappát a $ PATH változóhoz, ha létezik. Szóval ez a rejtély tisztázódik. A sorozat többi részéhez továbbra is a ~ / bin / könyvtárba helyezem a szkripteket, mert felhasználói szkriptek, és azokat a felhasználóknak kell futtatniuk. És úgy tűnik, hogy nem kell a $ PATH változót kézzel elrontani, hogy dolgokat dolgozzunk.

Ismétlődő parancsok hurokkal

Legyünk az egyik leghasznosabb eszköz a geek arzenálban az ismétlődő feladatok megoldásához: hurkok. Ma beszélünk "for" hurkokról.

A for-loop alapvető vázlata a következő:

for VARIABLE in LIST; do command1 command2 … commandn done

A VARIABLE bármely változó lehet, bár leggyakrabban a kisbetűs "i" kifejezést a konvenció használta. LIST a tételek listája; több elemet is megadhat (szétválasztva egy szóközzel), 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 megegyezés szerint vannak behúzva, így könnyebb látni a fészkelőket - hurkokat hurkokba helyezni (így ciklusonként hurokhatsz).

Mivel a listák elválasztóként szóközöket használnak - vagyis egy szóköz a lista következő tételére való áttérést jelent - a neveket tartalmazó szóközök nem túl barátságosak. Most tartsuk be a szóközök nélküli fájlokkal való munkát. 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 szkriptet a ~ / bin / "loopscript" könyvtárában. Ha nem emlékszik rá, hogyan kell ezt csinálni (beleértve a végrehajthatóvá tételét és a hash bang hack hozzáadását), nézze meg a bash parancsfájl alapok cikkét.

Írja be a következő kódot:

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

Ha futtatja a szkriptet, akkor csak azokat a listatartományokat kapja kimenetként.
Ha futtatja a szkriptet, akkor csak azokat a listatartományokat kapja kimenetként.
Elég egyszerű, igaz? Lássuk, mi történik, ha kicsit megváltoztatjuk a dolgokat. Módosítsa a szkriptet, így ezt mondja:
Elég egyszerű, igaz? Lássuk, mi történik, ha kicsit megváltoztatjuk a dolgokat. Módosítsa a szkriptet, így ezt mondja:

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

Ha ezt a szkriptet futtatja egy mappában, meg kell adnia a fájlok listáját, amelyeket kimenetként tartalmaz.
Ha ezt a szkriptet futtatja egy mappában, meg kell adnia a fájlok listáját, amelyeket kimenetként tartalmaz.
Most változtassuk meg az echo parancsot valami hasznosnak - mondjuk a zip parancsot. Nevezetesen fájlokat helyezünk el egy archívumba. És kapunk néhány érvet a mixben!
Most változtassuk meg az echo parancsot valami hasznosnak - mondjuk a zip parancsot. Nevezetesen fájlokat helyezünk el egy archívumba. És kapunk néhány érvet a mixben!

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

Van valami új! "$ @" Egy "$ 1 $ 2 $ 3 … $ n" parancsikon. Más szavakkal, ez az összes megadott argumentum teljes listája. Most nézze meg, hogy mi történik, ha a parancsfájlt több bemeneti fájllal futtatom.
Van valami új! "$ @" Egy "$ 1 $ 2 $ 3 … $ n" parancsikon. Más szavakkal, ez az összes megadott argumentum teljes listája. Most nézze meg, hogy mi történik, ha a parancsfájlt több bemeneti fájllal futtatom.
Megtekintheti, mely fájlok vannak a mappámban. Futtattam a parancsot hat argumentummal, és minden fájlt egy "archive.zip" nevű zip archívumhoz adtunk hozzá. Könnyű, igaz?
Megtekintheti, mely fájlok vannak a mappámban. Futtattam a parancsot hat argumentummal, és minden fájlt egy "archive.zip" nevű zip archívumhoz adtunk hozzá. Könnyű, igaz?

A hurok nagyon szép. Most a kötegfunkciókat végrehajthatja a fájlok listáján. Például átmásolhat minden parancsfájl argumentumát egy zip archívumba, áthelyezheti az eredeti dokumentumokat egy másik mappába, és automatikusan biztonságossá teheti a zip fájl másolását egy távoli számítógépre. Ha kulcsfontosságú fájlokat állít be az SSH segítségével, akkor nem kell megadnia a jelszavát sem, és a parancsfájl még a feltöltés után is törölheti a zip fájlt!

A for-hurkok használata megkönnyíti egy csomó műveletet a könyvtár összes fájljához. A parancsok széles választékát össze tudjuk rakni, és nagyon egyszerűen használhatjuk az argumentumokat a létrehozáshoz és az on-the-fly listához, és ez csak a jéghegy csúcsa.

Bash scripters, van valami javaslatod? Készítettél egy hasznos szkriptet, amely hurkot használ? Szeretne megosztani veletek gondolatait a sorozatról? Hagyjon néhány megjegyzést és segítsen más szkriptek újoncainak!

Ajánlott: