0. Index
- Olyan dolgok, amelyek a legtöbb emberrel történnek
- A szkript felépítése
- Nyomtatás a képernyőn
- Olvassa el az INPUT felhasználót
- Számítások bash-ban
- Feltételek
- Hurkok
- funkciók
- 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
BIN = "mappa, ahol vannak szkriptjeink" PATH = "$ BIN $ PATH"
2. A szkript felépítése
- Ágy fejlapja
- Globális változók meghatározása
- Segítség
- funkciók
- 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.
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.
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"
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))
6. feltételek
Már nagyon kiterjedten írták a «if""más""elif»És a feltételek. Erről itt olvashat:
- Programozás bash-ban: 1. rész
- Bash: ha, akkor más feltételek
- Ellenőrizze, hogy létezik-e fájl vagy mappa, vagy sem, és még több egy if ciklussal
- Programozás bash-ban: 2. rész
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ó
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.
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.
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ó).
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.
MESTERI. Nem mondok többet U_U
Szia nagyon jó cikk.
Hé, a chmod + x helyett sudo + x engedélyeket adsz
$ sudo chmod + x script.sh
(Pontosabban, hehe)
Gratulálok és köszönöm!
Nagyon jó hozzászólás, az igazság az, hogy gratulálok, tartsd fenn, üdvözlet
É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
A tuto darabja. Kiváló és nagyon jól megmagyarázható.
Köszönöm.
Kiváló bejegyzés a témában 😉
Nagyon érdekes és nagyon fontos köszönet az információkért.
EGÉSZSÉGÉRE !!!
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.
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!
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 😀).
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
Nagyon jó bash szkript bemutató!
-- 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)}' ».
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
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.
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!
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
Nagyon jó. Új dolgok hozzáadhatók a szkriptjeimhez. Az encodig dologban és a printf dologban nem volt meg.
Köszönöm!!!
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 !!!!