Minden, amit a Bash for Loops Linuxról tudnia kell

Minden, amit a Bash for Loops Linuxról tudnia kell

A Bash szkriptek rendkívül hatékony eszközei a feladatok automatizálásának, különösen azoknak, amelyek más meglévő programok előnyeit használják ki. Ez az automatizálás gyakran megköveteli egy hasonló művelet többszörös megismétlését, pontosan ott, ahol a hurokhoz bejön a sajátjába.





A Linux és a Mac rendszergazdái általában ismerik a terminálon keresztüli szkripteket, de még a Windows felhasználók is kezdjen bele a műveletbe a Windows Linux alrendszerrel .





A Bash Scripts működése

A bash parancsfájl egyszerűen egy sima szövegfájl, amely egy sor parancsot tartalmaz, amelyeket a bash shell tud olvasni és végrehajtani. A Bash az alapértelmezett shell a Catalina előtti macOS-ban és a legtöbb Linux disztribúcióban.





Ha még soha nem dolgozott shell parancsfájllal, akkor az abszolút legegyszerűbb esettel kell kezdenie. Ez lehetővé teszi a kulcsfogalmak gyakorlását, beleértve a szkript létrehozását és végrehajtását.

Először hozza létre a következő fájlt egy kényelmes helyen (ideális esetben nyisson meg egy terminált, és először navigáljon a kívánt könyvtárhoz):



#!/bin/bash
echo 'Hello, World'

Az első sor azt mondja meg, hogy a program futtatásának módja (azaz a bash interpreter használata) azt írja le. A második csak egy parancs, mint bármely más, amelyet a parancssorba írhat be. Mentse el a fájlt más néven hello_world.sh , azután:

$ chmod +x hello_world.sh
$ ./hello_world.sh

Az chmod parancs az első sorban futtathatóvá teszi a fájlt, ami azt jelenti, hogy a név beírásával futtatható, mint a második sorban.





Ha látja a Hello, World szavakat a terminál egy sorára nyomtatva, akkor minden megfelelően működik.

Hogyan működik a hurkok

Általában a programozásnak két fő típusa van a huroknak: számszerű és az egyes . A numerikus típus hagyományosan a leggyakoribb, de a bash használatban általában fordítva van.





A hurkok számjegyei általában egyetlen egész számra összpontosítanak, amely meghatározza, hogy hány iterációt hajtanak végre, például:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Ez egy ismerősnek tűnő ciklus, amely pontosan 100-szor fog ismétlődni, kivéve, ha a cikluson belül megváltoztatom az i-t, vagy ha egy másik utasítás miatt a for ciklus végrehajtása leáll.

Ezzel szemben a Foreach ciklusok általában struktúrákon, például listákon vagy tömbökön működnek, és a gyűjtemény minden elemére iterálnak:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Néhány nyelv kissé eltérő szintaxist használ, amely felcseréli a gyűjtés és az elem sorrendjét:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

A hurkokban

Bashban a prédikáció - vagy be - a hurok gyakoribb. Az alapvető szintaxis egyszerűen:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

Például három kifejezetten megnevezett fájlon keresztül történő iteráláshoz:

Hogyan lehet törölni a profilokat a PS4 -en
for file in one.c two.c three.c
do
ls '$file'
done

Ha ilyen fájlok léteznek az aktuális könyvtárban, akkor a parancsfájl kimenete a következő lesz:

one.c
two.c
three.c

Rögzített fájlkészlet helyett a listát globális mintával (egy helyettesítő karakterekkel - más karaktereket képviselő speciális karakterekkel) lehet megszerezni. A következő példában a for ciklus iterál minden olyan fájlban (az aktuális könyvtárban), amelyek neve '.xml' végű:

for file in *.xml
do
ls -l '$file'
done

Íme néhány példa kimenet:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

Ez nagyon hasonlíthat egy hosszú távú módszerhez:

$ ls -l *.xml

De van egy jelentős különbség: a for ciklus végrehajtja a ls programot 2 külön alkalommal, minden alkalommal egyetlen fájlnévvel. A különálló ls példában a glob minta (*.xml) először egyezik a fájlnevekkel, majd mindegyiket elküldi egyedi parancssori paraméterként a ls .

Íme egy példa, amely a WC (szószám) program a különbség nyilvánvalóbbá tételére:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

Az WC program külön számolja az egyes fájlok sorainak számát, majd kinyomtatja az összes számot. Ezzel szemben, ha WC for for cikluson belül működik:

for file in *.xml
do
wc -l $file
done

Továbbra is látni fogja az egyes fájlok számát:

44 feed.xml
231 sitemap.xml

De nincs összesített összegzés, mert WC elszigetelten fut, minden alkalommal, amikor a ciklus iterál.

Ha a lista nem lista

Van egy nagyon egyszerű és gyakori hiba a hurkok kezelésekor, mivel a bash kezeli az idézett argumentumokat/karakterláncokat. A fájlok listájának végiglapozását a következőképpen kell elvégezni:

for file in one.c two.c

Így nem:

for file in 'one.c two.c'

A második példa idézőjelekbe foglalja a fájlneveket, ami egyetlen paramétert tartalmazó listát eredményez; a for ciklus csak egyszer fog végrehajtódni. Ez a probléma elkerülhető egy változó használatával az alábbi esetekben:

FILES='one.c two.c'
for file in $FILES
do
...
done

Ne feledje, hogy maga a változó deklarációnak értékét dupla idézőjelbe kell foglalnia!

mennyi helyet foglal el a windows 10

Lista nélkül

Mivel nincs mit ismételni, a for ciklus a parancsfájlhoz adott parancssori argumentumok alapján működik. Például, ha van egy nevű szkriptje args.sh a következőket tartalmazza:

#!/bin/sh
for a
do
echo $a
done

Ezután az args.sh végrehajtásával a következőket kapja:

$ ./args.sh one two three
one
two
three

Bash felismeri ezt az esetet és kezeli tenni megfelelőjeként $@ do -ért ahol a $@ egy speciális változó, amely parancssori argumentumokat képvisel.

Hagyományos numerikus emuláció a hurokhoz

A Bash parancsfájlok gyakran a parancsok fájllistáival vagy kimeneti soraival foglalkoznak, így a for in típusú ciklus gyakori. A hagyományos c-stílusú művelet azonban továbbra is támogatott:

for (( i=1; i<=5; i++ ))
do
echo $i
done

Ez a klasszikus forma három részből áll:

  1. egy változó inicializálódik (i = 1) a ciklus első találkozásakor
  2. a ciklus addig tart, amíg a feltétel (i<=5) is true
  3. a ciklus körül minden alkalommal a változó növekszik (i ++)

A két érték közötti ismétlés elég gyakori követelmény, hogy létezik egy rövidebb, kissé kevésbé zavaró alternatíva:

for i in {1..5}
do
echo $i
done

A fogszabályozó tágulása hatékonyan lefordítja a hurok fentieket:

for i in 1 2 3 4

Finom hurok vezérlés szünet és folytatás

A bonyolultabb hurkok esetében gyakran szükség van a korai kilépésre vagy a főhurok azonnali újraindítására a következő értékkel. Ehhez a bash kölcsönzi a szünetet, és folytatja a más programozási nyelvekben gyakori utasításokat. Íme egy példa, amely mindkettőt használja az első több mint 100 karakter hosszú fájl megkereséséhez:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

A for ciklus itt az aktuális könyvtár összes fájlján működik. Ha a fájl nem rendszeres fájl (pl. Ha könyvtár), akkor a folytatás utasítással újraindítja a ciklust a következő fájllal. Ha ez egy normál fájl, akkor a második feltételes blokk határozza meg, hogy tartalmaz -e több mint 100 karaktert. Ha igen, akkor a break utasítás arra szolgál, hogy azonnal kilépjen a for ciklusból (és elérje a szkript végét).

Következtetés

A bash parancsfájl olyan fájl, amely végrehajtható utasításokat tartalmaz. A for ciklus lehetővé teszi egy szkript egy részének többszörös megismétlését. Változók, külső parancsok, valamint a break és folyton utasítások használatával a bash parancsfájlok bonyolultabb logikát alkalmazhatnak, és sokféle feladatot láthatnak el.

Részvény Részvény Csipog Email Érdemes Windows 11 -re frissíteni?

A Windows újra lett tervezve. De ez elég ahhoz, hogy meggyőzze Önt, hogy váltson a Windows 10 -ről a Windows 11 -re?

Olvassa tovább
Kapcsolódó témák
  • Programozás
  • Linux
A szerzőről Bobby Jack(58 cikk megjelent)

Bobby technológiai rajongó, aki két évtized nagy részében szoftverfejlesztőként dolgozott. Szenvedélyesen szereti a játékot, a Switch Player Magazin Vélemények szerkesztőjeként dolgozik, és elmerül az online közzététel és webfejlesztés minden területén.

Továbbiak Bobby Jack -től

Iratkozzon fel hírlevelünkre

Csatlakozz hírlevelünkhöz, ahol technikai tippeket, értékeléseket, ingyenes e -könyveket és exkluzív ajánlatokat találsz!

Feliratkozáshoz kattintson ide