Bash feltételek részletesen

„Mi lenne, ha?” Ez minden fejlesztés alapvető kérdése. Mi van, ha a felhasználó rákattint a négyzetre? Mi van, ha a értéke 4 és 10 között van? Mi van, ha létezik az XY fájl? Mi van, ha az 1. karakterlánc megjelenik a 2. karakterláncban? És mi lenne, ha intuitív módon érthető lenne, ahol a [[]], [], (()) és a teszt közötti különbségek rejlenek?

részletesen

A körülmények először életet lehelnek a szkriptekbe - nélkülük csak a legegyszerűbb feladatokat tudnák elvégezni, és a hurkok örökké futnának. Sajnos a bash körülmények nem különösebben vonzóak a kezdők számára.

Még egy teljesen kezdő is azonnal megért egy If lekérdezést, az If-Then-Else szintaxis eléggé magától értetődő (többet megtudhat a Bash-ban található hurkokról és lekérdezésekről). De a zárójel megkonstruálja a lekérdezéseket? Szögletes vagy kerek zárójelek, idézőjelek vagy sem - vagy talán nincsenek zárójelek?

Az első feltétel, amellyel találkozik, valószínűleg valami hasonló a "[$ i -eq 5]" kifejezéshez egy if-lekérdezésben:

Még egyszer el kell mondani, hogy az egyszerű egyenlőségjelet csak a húrok összehasonlítására használják, a numerikus értékeket és a többi értéket a == értékkel hasonlítják össze. És ebben az egyszerű szabványos lekérdezésben még három érdekes megállapítás található: egyrészt a "ha" itt egyáltalán nem szükséges, másrészt a zárójelek sem - a zárójelek mögötti/előtti szóközök viszont azonnal megteszik, amint felhasználják őket . Írhatna még:

A szögletes zárójel nem más, mint a "teszt" eszköz írásának egy másik módja. Egyszerűen világosabbá és könnyebben írhatóvá teszik a bonyolultabb feltételeket. És mivel a "&&" utáni parancs csak akkor kerül végrehajtásra, ha az előző parancs sikeresnek számol be, az "echo" itt csak akkor indul el a példában, ha a "var" valójában "Hello".

A dupla szögletes zárójelek viszont Bash saját megvalósításai, amelyek egyes dolgokat jobban vagy másként kezelnek. Ha konkrét példák alapján megvizsgálja a kettő közötti különbségeket, akkor van egy közös közös szála, hogy megközelítse a bash feltételeket.

Az összehasonlítás után a kettős kerek zárójelek kerülnek játékba. Nagyrészt megfelelnek a "let" parancsnak, amely kiértékeli a számtani műveleteket.

Feltételek a [és [[

A Test, [és [[három különböző összehasonlítási módot kínál: karakterláncokat, számokat és fájlokat. A fenti példához hasonlóan a húrokat egyszerűen összehasonlítjuk a "=" és a "! =" (Egyenlőtlen vagy nem egyenlő) szavakkal, tehát:

Még az első feltétel sem működik többé, ha a „$ a” szövege szóközöket tartalmaz, például a „Hello World” karakterláncot. Ezután idézőjelekre vagy dupla zárójelekre van szüksége:

A tesztváltozat a szokásos módon viselkedik, és fel nem osztott változókat oszt szét, a Bash-variáns ettől eltekint. Ez enyhíti a tipikus hibaforrást. Inkább azonban inkább ...

használja, ezért tegye az RHS-t (jobb oldali) idézőjelbe. Azért, mert [[elsajátítja a héjazást, és mindent megért az operátortól jobbra, ami nincs idézőjelben, mint glob. Ez azt jelenti: Ennek a szolgáltatásnak köszönhetően például gyorsan ellenőrizheti, hogy egy változó tartalma megfelel-e a "foobar_1", "foobar_2" vagy "foobar_3" húrok egyikének:

Ez egy nagyszerű funkció, de problémákat okoz, ha a változó tartalma szögletes zárójeles karakterlánc lenne, például "[foobar]". Idézetek nélkül a megoldott változó a következő állítást eredményezi:

Jól néz ki, de az RHS-t globálisnak tekintik, mondjuk „f vagy o vagy b. És az LHS, mint egy húr. Tehát általában jobb:

Egy erőteljes szolgáltatás teszi a [[végül kiválóbbá: Az operátor használata “=

"Összehasonlítható egy reguláris kifejezéssel, például itt:

^ [[: digit:]] _ foobar]] && True

Az egyenlőségjeltől jobbra lévő kifejezést POSIX alapszintű RegEx-ként értelmezik, ezért a "$ a" -nak 1-5 számjeggyel kell kezdődnie, és a "_foobar" -val kell végződnie.

A következő különbségek a [és [[között már nem (csak) karakterláncokat, hanem kombinációkat és fájlokat érintenek.

A fájl kiterjesztése és kombinációi

A karakterlánc-operátorok mellett mindkét eszköz mindenféle lehetőséget kínál a fájlszintű teszteléshez, például hogy létezik-e fájl (-e), két fájl azonos (-ef), létezik-e egy fájl és egy könyvtár (-d) stb. . A man oldal [https://man.cx/test] teljes áttekintést nyújt.

Az izgalmas dolog itt a fájlbővítés, vagyis a fájlnevek automatikus kiterjesztése, amelyet a következő példa mutat be:

Mindkét változat hamisan végződik - mi történt? [a csillaggal kibővül a könyvtár összes fájlnevére, így ebben a példában két argumentumot kap. De mivel csak egy dolog várható, az állítás valótlan. Csak akkor lenne igaz, ha pontosan egy fájl lenne .txt kiterjesztéssel a könyvtárban. [[teljesen más okból kudarcot vall: A fájlnév nem bővül ki - ennek következtében a "* .txt" nevű fájlt keresik itt.

Ha azonban meg szeretné tudni, hogy létezik-e legalább egy .txt fájl, keresse meg a grep és az ls segítségével, majd ellenőrizze, hogy a karakterlánc nem üres-e (-n):

A nagy végső különbség most a kombinációkra vonatkozik. A [[változat itt egyszerűen az AND és OR kissé gyakoribb jelölésére támaszkodik:

Tehát itt a „$ a” -nak tartalmaznia kell a „Hello” szöveget, ÉS a „$ b” -nek „world” -nak vagy „forest” -nek kell lennie. A teszt parancs ezért "-a" és "-o", [[de "&&" és "||" karaktereket használ. Ez azonban csak stíluskérdés, minden további befolyás nélkül.

Számtani műveletek

Még a számtani műveletek kiértékelésekor is [[felülmúlja a tesztparancsot. Mindkét esetben az összehasonlításokat egyszerűen rövidítéssel végzik: "-eq" az "egyenlő", "-lt" a "kevesebb mint", "-ge" a "nagyobb vagy egyenlő" és így tovább. Számíthat azonban dupla szögletes zárójelben is!

Az izgalmasabb változat egyértelműen itt a szakember, vagyis a dupla kerek zárójel. Egyrészt van egy szebb szintaxis az ismertebb operátorokkal:

Az ilyen érthetőbb, kisebb vagy egyenlő operátor mellett a konzolszerkezet valami egészen mást is kezelhet, mégpedig C-stílusú változókat; gyakran használják a számláló változók növekményéhez:

Mindkét hurok ugyanazt az eredményt hozza; a while változatban a feltételektől eltekintve a használat kissé világosabbá válik.

Elvitel

Alapvetően a feltételek viszonylag egyszerűek és egyértelműek, csak néhány szempontot kell figyelembe venni: Általában magabiztosan megszokhatja a dupla szögletes zárójeleket és használhatja a teszt parancsot, ha szüksége van az automatikus fájlnévkiterjesztésre.

A [[ismételten mindig emlékeznie kell arra, hogy az RHS-t globálisként kezeljük idézőjelek nélkül. Számtani kiértékelésekkel vagy műveletekkel a legjobb megszokni a dupla kerek zárójeleket: Akkor soha nem kell újragondolni a [[-tól ((-ig), a számtani összehasonlításokat azonnal fel kell ismerni a zárójelek típusa szerint, és könnyebben lehet velük számolni is.

Python oktatóanyag, 7. rész

Rekurziók és rendszeres kifejezések

Kimenet a while, amíg és for

Hurok végrehajtása a bash-ban

Ez a weboldal a Vogel Communications Group védjegye. Az összes termékről és szolgáltatásról áttekintést talál a www.vogel.de oldalon

StartupStockPhotos; Hármas; Charlotte Coneybeer