Bash-elmélet

/ bin / bash

0. Index

  1. Olyan dolgok, amelyek a legtöbb emberrel történnek
  2. A szkript felépítése
  3. Nyomtatás a képernyőn
  4. Olvassa el az INPUT felhasználót
  5. Számítások bash-ban
  6. Feltételek
  7. Hurkok
  8. funkciók
  9. getops

1. Olyan dolgok, amelyek a legtöbb emberrel történnek

/ bin / bash vagy / bin / sh

Az egyik első dolog, amit a gép a szkriptünk végrehajtásakor tesz, azt vizsgálja, hogy melyik héjjal kell megtennie. A legtöbb jelenlegi Linux rendszeren / Bin / sh link a / bin / bash, de ez nem mindig így van, például a használt disztribúciókban foglalt doboz hozza Sh és általában ők is hoznak Bash, de ha használja / Bin / sh, nem fog futni Bash-szal. Ezért javasoljuk, hogy mindig használja / bin / bash.

Unicode vs. ASCII

Gondolkodott már azon, miért nem használhatja a "¿" vagy "ñ" karaktereket a szkriptjeiben? Vagy ékezeteket használ? Interaktív szkriptekben elég bosszantó lehet. A Bash alapértelmezett kódolása ugyanis az ASCII, vagy ami ugyanaz, az angol karakterkészlet. A változtatáshoz csak azt kell mondanunk a szkriptünknek, hogy az Unicode-ot akarjuk használni. Ehhez hozzá kell adnia egy sort közvetlenül a parancsértelmező után:

# - * - KÓDOLÁS: UTF-8 - * -

Legyen óvatos, fontos, hogy ez a sor a szkript elején legyen.

Tegye futtathatóvá a szkriptet

Vicces, hogy hány ember futtatja a szkripteket «$ bashscript.sh" ahelyett "$ ./script.sh- Végül is erre definiáltunk egy héjat.

A végrehajtási engedélyek hozzáadásához végre kell hajtania:

sudo + x script.sh
Ha a szkriptünk futtatható, felvehetjük a PATH-ba, és futtathatóvá tehetjük a számítógépünk bárhonnan / mappájából. Ehhez hozzá kell adnunk a felhasználónk .bashrc fájljához vagy az / etc / bashrc sorhoz
BIN = "mappa, ahol vannak szkriptjeink" PATH = "$ BIN $ PATH"
Bash szabály, hogy a változóneveket nagybetűkkel írjuk. Sokan nem tartják be ezt a szabályt, de a hosszú szkriptek esetében nagyra értékelik, mert sokkal olvashatóbbá teszik őket

2. A szkript felépítése

  1. Ágy fejlapja
  2. Globális változók meghatározása
  3. Segítség
  4. funkciók
  5. Főtest

A fejléc jelzi, hogy melyik héjat akarjuk használni, és a kódolást. A függvények előnye, hogy újból felhasználják a kódot, amelyet csak egyszer írnak, és megkönnyítik a szkript megértését, a 100 sort meghaladó kódoknál ez nagyon hasznos.

A függvények használatához meg kell adni őket a szkriptünk fő törzse előtt. Ha pedig az összes szkriptünk globális szintjén szeretnénk változókat használni, mind a törzsben, mind a függvényekben, akkor azokat minden elején meg kell határoznunk, közvetlenül a fejléc után.

Végül jó gyakorlat segítő függvényt írni, amikor a szkriptünk rosszul vagy rossz paraméterekkel fut. Nyilvánvaló, hogy ezekben az esetekben azonnal ki akarunk lépni a szkriptből, a funkciók elolvasása nélkül. Ehhez használhatjuk:

function help () {echo "" "Jól formázott súgó szövegünk." "" kilépés, ha [[-z $ 1 || $ 1 == "-h" || $ 1 == "--help"]]; akkor segítsen fi

Ha a súgófunkcióhoz hozzáadjuk az "exit" -t, akkor minden alkalommal kilépünk a szkriptből, amikor a súgót futtatjuk, például hibaüzenetek után stb. Elmentünk néhány kódsort.

A feltétel azt jelzi, hogy a képernyőn megjelenik a súgó, és kilép, ha a parancsfájl paraméterek nélkül fut, vagy ha -h / –help van megadva. Ha megnézzük, ez a legtöbb linuxos program szokásos viselkedése.

A 3 visszhangos idézőjel használata lehetővé teszi a sortörések használatát anélkül, hogy hagyná az üzenet visszhang által történő megjelenítését. Többsoros üzeneteknél sokkal kényelmesebb az echo csak egyszeri használata.

3. Nyomtatás a képernyőn

Két fő parancs van a bash képernyőn történő nyomtatáshoz: «visszhang»Y«printf«. Mindkettő ugyanolyan gyors, és mindkettő a bash része. A fő különbség egy kezdő számára az, hogy az echo új sort ad a végén, míg a «printf"Nem.

Az visszhang nagyon jó, és ezt a legtöbb ember használja, azonban amikor a felhasználó INPUT-ját olvassa, vagy amikor szöveges feldolgozással fájlokból vett változókat akar nyomtatni, különös dolgok történhetnek. Általában könnyen megoldhatók, olyan egyszerűek, mint a dupla idézőjelek egyetlenre vagy fordítva történő megváltoztatása, vagy a változó hivatkozások kivétele az idézőjelekből. «visszhang»Különös dolgokat csinál a fordítás módjától is függően, ha mindig az Ubuntut vagy a Fedorát használjuk, az nem befolyásol minket, de ha megváltoztatjuk az elosztást.

Ezért használom a «printf«, Ami nem okoz fejfájást, és inkább úgy viselkedik, mint«printf»C-től vagy a«nyomtatás»A Python esetében ez nagyon fontos, ha valaha át akarja másolni a szkriptet egy másik programozási nyelvre.

Egy szélesebb körű vitához látogasson el ezt a kérdést a Unix és a Linux a Stack Exchange-en.

4. Olvassa el az INPUT felhasználót

Minden, amit a szkriptünk neve után írunk és mielőtt az ENTER billentyűt lenyomnánk, automatikusan speciális változókba kerül. Ezek a változók $ X típusúak, ahol X szám.

«$0»Jelzi a szkriptünk nevét és a«$1»A végtelenségig minden, amit később írtunk, változó. Például:

macska << EOF >> test.sh #! / bin / bash # - * - KÓDOLÁS: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n" EOF chmod + x script.sh ./script.sh fájlom.txt

Hozzunk létre egy teszt szkriptet, futtathatóvá tesszük és 2 paraméterrel futtatjuk. Megkapjuk a képernyőkimenetet:

$ 0 = ./script.sh $ 1 = my $ 2 = file.txt

Idézetekkel átadhattuk volna a "my file.txt" fájlt a "$ 1" fájlnak.

A felhasználó INPUT-ját a "read" paranccsal is leolvashatjuk, közvetlenül jelezve a változót, ahová a paramétert el akarjuk menteni. Például:

printf "Mi a neved? \ n" olvasd a NAME nevet printf "Hello, $ NAME. \ n"
Legyen óvatos a változók hozzárendelésével. A "$ VAR = content" hibát eredményez, nem hagyhat szóközt az egyenlőségjel, a változó neve és a tartalom között. A helyes használat: "VAR = content"

5. Számítások Bash-ban

Ehhez használhatjuk a «kifejez«, Amíg nincs szükségünk komplex számításokra. Két dolgot kell megjegyezni, az első az, hogy «kifejez»Csak egész számokat fogad el, a második az, hogy az osztás visszaadja az egész eredményt, hogy lássuk a többit, amit felhasználhatunk«%”.

Általában az expr eredményét akarjuk rendelni egy változóhoz. Ezt kétféleképpen tehetjük meg:

VAR2 = "expr $ VAR1 / 10" VAR2 = $ (expr $ VAR1 / 100)

Kihagyhatja a «kifejez»Dupla zárójelek használata:

VAR2 = $ (($ VAR1 / 100))
További magyarázat a «kifejez»Vagy egy alternatívát, amely egész számokat használ, megnézheti ez a KZKG ^ gaara bejegyzés.

6. feltételek

Már nagyon kiterjedten írták a «if""más""elif»És a feltételek. Erről itt olvashat:

Csak az egyszerű szögletes zárójelek használata közötti különbséget szeretném kiemelni, «[]«, És dupla zárójelek,«[[]]«, A feltételekre. Dupla zárójelekkel további feltételeket is alkalmazhatunk:

  • «&&»Mire és
  • «||»A vagy

Használni "&&»Y«||»Az egyszerű szögletes zárójelek segítségével az egyes részeket külön szögletes zárójelben kell elválasztani. A szkript azon részéhez használt példa, amely úgy néz ki, hogy segítséget kell-e végrehajtani:

ha [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--segítség"]]; akkor segítsen fi

Az is megkímél bennünket, hogy a hibák elkerülése érdekében változóneveket idézőjelbe kell írnunk. Például:

ha [$ 1 = 1]; majd printf "A paraméter egyenlő 1-vel."; fi ha ["$ 1" = 1]; majd printf "A paraméter egyenlő 1-vel."; fi ha [[$ 1 = 1]]; majd printf "A paraméter egyenlő 1-vel."; fi

Ha a script.sh paraméterek nélkül fut, az első eset hibát okoz:

bash: [: =: unariás operátor várható
Bash-ban a "=" és "==" kifejezéseket ugyanúgy értelmezik. Ez nem fordul elő más programozási nyelvekben, ahol a "=" -t csak változók hozzárendelésére használják.

Amiről még nem esett szó, az «eset«, Leegyszerűsítésre«if«. Kezdjük az elején, amikor még nincsenek «if»Minden kód végrehajtásra kerül. Ha hozzáadunk egy feltételt «if»Két esetünk lesz, az egyikben a kódblokk, amely a«if»És a másik eset, amikor ezt a blokkot nem hajtják végre.

Ha hozzáadunk egy «más«Két esetünk is lesz, de ez a két eset eltér az előzőektől. Mert most két feltételes kódblokk lesz, A és B, valamint egy C blokk, ami a program többi része. A vagy B végrehajtásra kerül, és C. Az előző esetben A és C, vagy csak C volt.

Az írási feltételek elkerülése érdekében «ha más"belül"más»És a kód olvasásának egyszerűsítése érdekében létrehozták«elif«. Ha sok feltételünk van, amelyek az előzőtől függenek, például számtartomány vagy típus:

VAR1 = $ 1, ha [[$ VAR1 = 1]]; majd printf "1 \ n" elif [[$ VAR1 = 2]]; majd printf "2 \ n" elif [[$ VAR1 = 3]]; akkor printf "3 \ n" else printf "nincs \ n" fi

Az utolsó «elif»Sok feltétel olvasható. Esettel ez a folyamat egyszerűsödik:

VAR1 = $ 1 eset $ VAR 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 vagy 4, ez attól függ, \ n" ;; *) printf "nincs \ n" ;; hogy C

Egy változó ki lesz olvasva, ebben az esetben a VAR1, és ellenőrizni fogjuk, hogy egyenértékű-e valamelyik esettel, ha nem, akkor az alapértelmezett "*" eset kerül végrehajtásra. A kettős pontosvessző egyenértékű a «szünet", Ők mondják"eset»Ennek véget kell vetni.

«Ügy»Sorozatként is használható«if«, Ehhez a« ;; »helyett a« ;; & »(folytatás) szót kell használnia. (álljon meg).

7. Hurkok

Nagyon kevés hurok ismeretes bármely programozási nyelven. Bash-ban ők «míg""-ig»Y«mert«. Ezekről a blogban már írtak:

Kétféle hurok létezik «mert«, Azok, amelyek a típus«$ a VAR-ért a LOQUESEA-ban»És melyek a C típusú«$ for ((I = 0; I <= 10; I ++))«. A második típusú hurkok «mert»Nagyon hasznosak, 3 részből áll a hurok elején:

  • A változók deklarálása és kezdeményezése (ebben az esetben egy "I = 0" segédváltozó).
  • Végrehajtási feltétel (amíg I kisebb vagy egyenlő, mint 10).
  • A segédváltozó növekedése

Véleményem szerint ez a legerősebb hurok. Egy példa, amely az összes számot kiírja 0-tól 10-ig, beleértve:

#! / bin / bash for ((I = 0; I <= 10; I ++)); csináld a "$ I \ n" nyomtatást

8. Funkciók

Van néhány dolog, amit Bash nem enged meg nekünk, igaz? Első pillantásra a bash függvények megakadályozzák, hogy 3 dolgot hajtson végre: a helyi változók deklarálását a függvényekben, a paraméterek továbbítását a függvényekhez és a paraméterek visszaadását. Mindennek megvan a megoldása.

Ne tegyen semmit:

#! / bin / bash VAR = 1 printc "$ VAR \ n" függvény hello () {VAR = 2 printf "$ VAR \ n"} hello printf "$ VAR \ n"

Ez kinyomtatja az 1., 2. és 2. képernyőt.

A helyi változók deklarálásához adjon hozzá «helyi»Nyilatkozatkor:

#! / bin / bash VAR = 1 printf "$ VAR1 \ n" függvény foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"

Ezzel 1, 1, 2, 1 nyomtat a képernyőn.

Hogyan adhat át paramétereket egy függvénynek?

#! / bin / bash # - * - KÓDOLÁS: UTF-8 - * - function hello () {printf "Hello $ 1 \ n"}

printf "Mi a neved? \ n"
olvassa el a VAR1-et
szia $ VAR1

Hogyan adják vissza a paramétereket?

#! / bin / bash # - * - KÓDOLÁS: UTF-8 - * - function hello () {printf "Hello holita"} printf "Mi a neved? \ n" olvasd el a VAR1 VAR1 = $ (hello) # ITT VAN printf "$ VAR1 $ VAR2 \ n"

Mint látható, ennek két hátránya van, csak egy paramétert adhat vissza, amely lehet vektor a, és ha vissza akar adni egy paramétert, akkor már nem nyomtathat a képernyőn ettől a függvénytől.

Podéis encontrar más cosas de funciones en [url=https://blog.desdelinux.net/programando-en-bash-parte-3/]este artículo de Usemoslinux[/url].

9. Getops

Az egyik utolsó dolog, amit tudnia kell a Bash-ról a komplex szkriptek létrehozásához:getops«. Arra szolgál, hogy az opciókat átadja a parancsfájlnak, a sorrendtől függetlenül. Az egyetlen hátrány, hogy csak a rövid lehetőségeket érinti:

#! / bin / bash # - * - KÓDOLÁS: UTF-8 - * - VARC = 0 függvény súgó () {printf "Súgóüzenet \ n" kilépés}, ha [[-z $ 1]]; majd segítsen fi közben getopts: ha: b: c OPT; tegyen $ OPT h) segítséget ;; :) Segítség ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) Segítség ;; esac done # A szkript fő blokkja, amely # dolgokat végez a VARA, a VARB és a VARC használatával

«getopts»Egyenként olvassa az opciókat, ezért hurokra van szükség.

Kétféle opció adható át a «felszáll„:

  • A zászlóknak nevezett paraméterek, ebben az esetben -c vagy -h. Meg vannak jelölve a betűvel, amelyet használni akarunk. Olyanok, mint a logikai változók, «igaz»(Are) vagy«hamis"(Nincsenek itt).
  • Paraméterek társított argumentumokkal, -a bármi, -b bármi. Ezeket a kívánt betűvel írjuk le, kettőspont alatt. Az argumentum az OPTARG-ban van tárolva (ez a név nem változtatható).
A kezdeti dupla pontok nem mutatnak hibákat.

Mit csinál ez a szkript?

Megjeleníti a súgóüzenetet, ha nincs átadva opció, ha a "-h" paramétert adják át, ha érvénytelen paramétert adnak át (például "-x", ezt a "\" "adja meg), vagy ha egy érvényes paraméter nincs argumentum (":"). A többi esetben megmenti a "-c" jelenlétét 1-ként a VARC-ban, és az "-a" és "-b" jelekkel átadott értékeket a VARA és a VARB.


Hagyja megjegyzését

E-mail címed nem kerül nyilvánosságra. Kötelező mezők vannak jelölve *

*

*

  1. Az adatokért felelős: Miguel Ángel Gatón
  2. Az adatok célja: A SPAM ellenőrzése, a megjegyzések kezelése.
  3. Legitimáció: Az Ön beleegyezése
  4. Az adatok közlése: Az adatokat csak jogi kötelezettség alapján továbbítjuk harmadik felekkel.
  5. Adattárolás: Az Occentus Networks (EU) által üzemeltetett adatbázis
  6. Jogok: Bármikor korlátozhatja, helyreállíthatja és törölheti adatait.

  1.   élénk dijo

    MESTERI. Nem mondok többet U_U

  2.   Miguel dijo

    Szia nagyon jó cikk.
    Hé, a chmod + x helyett sudo + x engedélyeket adsz

    1.    Henrik dijo

      $ sudo chmod + x script.sh
      (Pontosabban, hehe)

      Gratulálok és köszönöm!

  3.   tűzeset dijo

    Nagyon jó hozzászólás, az igazság az, hogy gratulálok, tartsd fenn, üdvözlet

  4.   Gustavo dijo

    És ha azt szeretné, hogy a szkript futtatásakor látható legyen, lépésről lépésre, például látva a változók, a feltételek és minden viselkedését, használhatja:

    sh -x szkript

    Üdvözlet

  5.   digó dijo

    A tuto darabja. Kiváló és nagyon jól megmagyarázható.
    Köszönöm.

  6.   Gabriel dijo

    Kiváló bejegyzés a témában 😉

  7.   Mario Guillermo Zavala Silva dijo

    Nagyon érdekes és nagyon fontos köszönet az információkért.
    EGÉSZSÉGÉRE !!!

  8.   Nem Brbrooklynból dijo

    Köszönöm mindenkinek a gratulációkat, ami a Miguel parancsot illeti, nem engedte, hogy módosítsam a bejegyzést, miután közzétettem. Elavot kell tennie, elképzelem.

  9.   Adrian dijo

    Nagyon jó!

    Először is gratulálni akartam önnek a bejegyzéshez, könnyen érthetőnek találtam, és valóban segít betartani az irányelveket, hogy jól programozzak a bash-ban, különösen azok számára, akik kezdenek programozni.

    Találtam azonban néhány olyan részletet, amelyet szerintem helyesbíteni kellene.

    Először: a «2. Szakaszban. A SZKÉRZET FELÉPÍTÉSE »a funkció nincs bezárva, ami problémákat okoz a parancsfájlban történő végrehajtáskor.
    A megoldás az lenne, ha egy záró zárójelet adna hozzá közvetlenül az "exit" parancs után.

    Második: a «4. Szakaszban. OLVASSA EL A FELHASZNÁLÓ BETÖLTÉSÉT ”megerősíti, hogy a felhasználó által megadható paraméterek a 0 és a végtelen közötti tartományba esnek, azonban a„ bash ”csak 0 és 9 dollár közötti értéket értelmez, mivel a 10 dollár egyenlő lenne 1 + 0 dollárral.
    A probléma megoldásához használhatja a "shift" parancsot a következő változók megragadásához. Vagy adja meg a változót zárójelben "$ {10}", hogy a bash vegye az értékeket, ne pedig $ 1 + 0-ként.

    Minden további nélkül üdvözlet!

    1.    Nem Brbrooklynból dijo

      Köszönöm a hozzászólásod. Teljesen elmagyarázta az exit helyes használatát mind a szkriptben, mind a függvényekben. Ami a következőt illeti: $ {10}, még soha nem hagytam ennyit, ezért nem merültem fel e problémában, jó tudni, hogy erre van megoldás (már kihúztam a ma megtanult új dolgot 😀).

  10.   chanio dijo

    Nagyon köszönöm a cikket! Néhány dolgot, amelyet megemlített, még mindig hiányzott. Például getops.
    A képernyő kimenetek részében meg kellett említenie a macskát, amelyet később megemlített ...
    macska <
    ***************************************
    * Ez a forma nagyon kifejező *
    ***************************************
    EOF

    A példádban:
    macska << EOF >> teszt.sh
    Két dolgot kell megemlíteni ... >> ez az 'append', vagyis ha ugyanazt a parancsot ismételjük meg, akkor a teljes szkript két példányban lesz ... Csak egyet szabad használni ...
    macska << EOF> script.sh
    Igen, script.sh-nek is kell nevezni
    Aztán be
    ha [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- segítség"]]; azután
    segít
    fi

    Szerintem meg kellene írni ...
    ha [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- segítség"]]; azután
    ...

    Sokkal többet kell felfedezni a BASH-tól.
    Nevezhetné "ALAPOK" -nak? 🙂
    Például a 'tesztelők' paraméternek tetszik -z, hogy üresek-e, vagy -f, hogy létezik-e fájlként.

    Még egyszer köszönöm a fáradságot.
    alberto

  11.   clow_eriol dijo

    Nagyon jó bash szkript bemutató!

  12.   OCZ dijo

    -- KÓDOLÁS: UTF-8 --

    Először láttam ezt a sort, hogy beállítsam a karakterkódolást egy bash szkriptbe. Tipikusabbnak tűnik a Pythonra, mint a Bash-re. Tényleg szükséges? Kerestem egy hivatkozást a Google-on, de nem találok semmit. Van-e kéznél link, amely erről az ügyről szól? Pontosabban az adott vonal alkalmasságáról.

    Véleményem szerint ahhoz, hogy szkripteket írhassunk Bash-ba az UTF-8 használatával, csak a szövegfájlt kell elmentenie (BOM nélkül), és bizonyos környezeti változókat (LANG és LC_ *) kell helyesen beállítani.
    Ezután nyilvánvaló, hogy a végrehajtott parancsokat fel kell készíteni az ASCII-től eltérő kódolásokra. Például, ha nagybetűkre akarunk menni, úgy tűnik, ez nem működik:
    «Visszhang áéíóú | tr az AZ »
    o:
    «Visszhang áéíóú | tr [: alsó:] [: felső:] »
    és jobb használni:
    «Visszhang áéíóú | awk '{print toupper ($ 0)}' ».

    1.    Nem Brbrooklynból dijo

      Valamivel kapcsolatban "kódolás»Korábban már említettük ebben a blogban:

      Bash: hogyan lehet egy szkriptet futtathatóvá tenni
      Telepítés utáni segédprogram szkript

    2.    borriquito, mint te dijo

      Valaki kijavított, de az a kódoló sor (# -- KÓDOLÁS: UTF-8 --) Semmi köze a bash-hoz vagy a shell-hez: ez egy megjegyzéssor (# -nel kezdődik), és arra szolgál, hogy elmondja a SZERKESZTŐNEK, hogy a szkript (vim, emacs ...) kódolásához írjuk.

      Valójában Bash nem lát ilyen sort, mert ez egy megjegyzéssor.

  13.   JoRgE-1987 dijo

    Kiváló oktatóanyag, mivel a Sysadmin elengedhetetlen a Bash-ben írt parancsfájlok készítéséhez, mindenhez hasznos.

    Nagyon nagyon jó!

    Üdvözlet!

  14.   Edward Cuomo dijo

    Abban az esetben, ha bárki számára hasznos, íme néhány felhasználási lehetőség és példa saját szkriptek létrehozására: https://github.com/reduardo7/hsabx

  15.   Lito Black dijo

    Nagyon jó. Új dolgok hozzáadhatók a szkriptjeimhez. Az encodig dologban és a printf dologban nem volt meg.
    Köszönöm!!!

  16.   xxxtonixxx dijo

    Szóval jó cikk! Ezt a kedvencekhez tartom, jó lenne kijavítani a hibát, és még több tartalommal kibővíteni. Taps az összes ilyen információért !!!!