Bash teorija

/ bin / bash

0. Kazalo

  1. Stvari koje se događaju većini ljudi
  2. Struktura skripte
  3. Ispis na ekranu
  4. Pročitajte ULAZ korisnika
  5. Izračuni u bash
  6. Uvjeti
  7. Petlje
  8. Funkcije
  9. Getopi

1. Stvari koje se događaju većini ljudi

/ bin / bash ili / bin / sh

Jedna od prvih stvari koje stroj radi prilikom izvršavanja naše skripte je gledanje s kojom školjkom bi to trebao učiniti. Na većini trenutnih linux sustava / Bin / sh je poveznica na / bin / bash, ali to nije uvijek slučaj, na primjer u distribucijama koje koriste zauzeto donijeti Sh a obično i donose Tresnuti, ali ako koristite / Bin / sh, neće se pokretati s Bashom. Zato preporučujem uvijek upotrebu / bin / bash.

Unicode u odnosu na ASCII

Jeste li se ikad zapitali zašto u svojim skriptama ne možete upotrijebiti "¿" ili "ñ"? Ili koristiti naglaske? To može biti prilično dosadno u interaktivnim skriptama. To je zato što je zadano kodiranje Basha ASCII, ili što je isto, engleski znak. Da bismo je promijenili, samo moramo reći našoj skripti da želimo koristiti Unicode. Za to morate dodati redak odmah nakon interpretatora naredbi:

# - * - KODIRANJE: UTF-8 - * -

Budite oprezni, važno je da je ovaj redak na početku skripte.

Neka skripta bude izvršna

Smiješno je koliko ljudi pokreće skripte s «$ bash skripta.sh" umjesto "$ ./script.sh'Napokon, za ovo smo definirali školjku.

Da biste dodali dozvole za izvršenje, morate izvršiti:

sudo + x skripta.sh
Ako je naša skripta izvršna, možemo je dodati na naš PUT i učiniti izvršnom s bilo kojeg mjesta / mape na računalu. Za to moramo dodati ili .bashrc našeg korisnika ili u / etc / bashrc redak
BIN = "mapa u kojoj imamo skripte" PATH = "$ BIN $ PATH"
Bash je pravilo pisati imena varijabli velikim slovima. Mnogi se ljudi ne pridržavaju ovog pravila, ali zbog dugih skripti to se cijeni jer ih čine mnogo čitljivijima

2. Struktura skripte

  1. Uzglavlje
  2. Definicija globalnih varijabli
  3. Pomoći
  4. Funkcije
  5. Glavno tijelo

Zaglavlje je mjesto gdje naznačujemo koju ljusku želimo koristiti i kodiranje. Prednost funkcija je ponovna upotreba koda koji se ponavlja tako da se napiše samo jednom i kako bi se olakšalo razumijevanje skripte, jer je kod koji prelazi 100 redaka vrlo koristan.

Da bi se koristile funkcije, one moraju biti definirane s prije glavnog dijela naše skripte. A ako želimo koristiti varijable na globalnoj razini cijele naše skripte, i u glavnom dijelu i u funkcijama, moramo ih definirati na početku svega, odmah nakon zaglavlja.

Na kraju, dobra je praksa pisati pomoćnu funkciju kada naša skripta radi loše ili s lošim parametrima. Očito je da u tim slučajevima želimo odmah izaći iz skripte, bez čitanja funkcija. Za to možemo koristiti:

function help () {echo "" "Naš dobro oblikovan tekst pomoći." "" izlaz ako [[-z $ 1 || $ 1 == "-h" || $ 1 == "--pomoć"]]; onda pomozi fi

Ako dodamo "izlaz" u funkciju pomoći, izaći ćemo iz skripte svaki put kad pokrenemo pomoć, na primjer nakon poruka o pogreškama itd. Uštedjeli smo nekoliko redaka koda.

Uvjet označava prikaz pomoći na ekranu i izlaz ako se skripta izvodi bez parametara ili ako je naveden -h / –help. Ako pogledate, to je standardno ponašanje većine linux programa.

Korištenje 3 navodnika s odjekom omogućuje vam da koristite prelome redaka ne ostavljajući poruku za prikaz putem odjeka. Za višeredne poruke puno je prikladnije eho koristiti samo jednom.

3. Ispis na ekranu

Postoje dvije glavne naredbe za ispis na zaslon u bashu: «odjek»Y«printf«. Oboje su jednako brzi i obojica su dio basha. Glavna razlika za početnike je ta što eho na kraju dodaje novu liniju, dok «printf"Ne.

Echo je u redu i ono je što većina ljudi koristi, međutim, prilikom čitanja korisnikova INPUT-a ili kada želite ispisati varijable preuzete iz datoteka obradom teksta, mogu se dogoditi neobične stvari. Obično se lako rješavaju, lako poput mijenjanja dvostrukih navodnika u jednostruke ili obrnuto ili uklanjanja referenci varijabli iz navodnika. «Odjek»Čini li neobične stvari i ovisno o tome kako je sastavljen, ako uvijek koristimo Ubuntu ili uvijek Fedoru, to ne utječe na nas, ali ako promijenimo distribuciju, to i učini.

Zbog toga koristim «printf«, Što me ne boli u glavi, a ponaša se više poput«printf»Iz C ili«otisak»Python, ovo je vrlo važno ako ikada želite prenijeti svoju skriptu na drugi programski jezik.

Opširniju raspravu možete posjetiti ovo pitanje od Unixa i Linuxa na Stack Exchangeu.

4. Pročitajte ULAZ korisnika

Sve što napišemo nakon naziva naše skripte i prije nego što pritisnemo tipku ENTER automatski se sprema u posebne varijable. Te su varijable tipa $ X gdje je X broj.

«$0»Označava naziv naše skripte i od«$1»Do beskonačnosti sve što smo kasnije napisali je promjenjivo. Na primjer:

mačka << EOF >> test.sh #! / bin / bash # - * - KODIRANJE: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n "EOF chmod + x script.sh ./script.sh moja datoteka.txt

Izrađujemo testnu skriptu, činimo je izvršnom i pokrećemo s 2 parametra. Dobivamo izlaz na ekranu:

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

Koristeći navodnike mogli smo proslijediti "my file.txt" na "$ 1".

Također možemo pročitati ULAZ korisnika pomoću naredbe "read", izravno ukazujući na varijablu u kojoj želimo spremiti parametar. Na primjer:

printf "Kako se zoveš? \ n" pročitaj IME printf "Zdravo, $ NAME. \ n"
Budite oprezni s dodjeljivanjem varijabli. "$ VAR = content" generirat će pogrešku, ne smiju se ostavljati razmaci između znaka jednakosti, imena varijable i sadržaja. Ispravna upotreba je "VAR = sadržaj"

5. Izračuni u Bashu

Za to možemo koristiti «Expr«, Sve dok ne trebamo raditi složene izračune. Treba napomenuti dvije stvari, prva je da «Expr»Prihvaćaju samo cijele brojeve, drugo je da dijeljenje vraća cijeli rezultat, da vidimo ostalo što možemo koristiti«%”.

Obično ćemo želju rezultat izraza dodijeliti varijabli. To možemo učiniti na dva načina:

VAR2 = `izraz $ VAR1 / 10` VAR2 = $ (izraz $ VAR1 / 100)

Također možete preskočiti «Expr»Upotreba dvostrukih zagrada:

VAR2 = $ (($ VAR1 / 100))
Za daljnje objašnjenje «Expr»Ili alternativu koja koristi cijele brojeve, možete pogledati ovaj unos KZKG ^ gaara.

6. uvjeti

Već je vrlo opširno napisano o «if„”drugo„”Elif»I uvjeti. O tome možete pročitati u:

Želim samo naglasiti razliku između upotrebe jednostavnih uglatih zagrada, «[]«, I dvostruke zagrade,«[[]]«, Za uvjete. Dvostrukim zagradama možemo koristiti dodatne uvjete:

  • «&&»Za i
  • «||»Za ili

Koristiti "&&»Y«||»Jednostavnim uglastim zagradama svaki dio treba odvojiti u zasebne uglate zagrade. Primjer koji se koristi za dio skripte koji izgleda da li treba izvršiti pomoć bio bi:

ako [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- pomoć"]]; onda pomozi fi

Također nas štedi od potrebe za zapisivanjem imena varijabli u navodnike kako bismo spriječili pogreške. Na primjer:

ako je [$ 1 = 1]; zatim printf "Parametar je jednak 1."; fi ako ["$ 1" = 1]; zatim printf "Parametar je jednak 1."; fi ako [[$ 1 = 1]]; zatim printf "Parametar je jednak 1."; fi

Ako se script.sh izvodi bez ikakvih parametara, prvi će slučaj dati pogrešku:

bash: [: =: očekuje se unarni operator
U bashu se "=" i "==" tumače na isti način. To se ne događa u drugim programskim jezicima gdje se "=" koristi samo za dodjeljivanje varijabli.

Ono o čemu se nije razgovaralo je «slučaj«, Koristi se za pojednostavljenje«if«. Krenimo od početka, kad nemamo «if»Izvršit će se sav kôd. Ako dodamo uvjet «if»Imat ćemo dva slučaja, jedan u kojem blok koda koji se nalazi unutar«if»I drugi slučaj kada se ovaj blok ne izvršava.

Ako dodamo «drugo«Također ćemo imati dva slučaja, ali ova dva slučaja razlikuju se od prethodnih. Jer sada će postojati dva uvjetna bloka koda, A i B, i C blok, što je ostatak programa. Izvršit će se A ili B i C. U prethodnom slučaju to su bili A i C ili samo C.

Da bi se izbjegli uvjeti pisanja «ako / inače"unutar"drugo»A radi pojednostavljenja čitanja koda, stvoren je«Elif«. Kada imamo mnogo uvjeta koji ovise o prethodnom, na primjer raspon brojeva ili vrsta:

VAR1 = 1 USD ako [[$ VAR1 = 1]]; zatim ispišitef "1 \ n" elif [[$ VAR1 = 2]]; zatim ispišitef "2 \ n" elif [[$ VAR1 = 3]]; zatim printf "3 \ n" inače printf "none \ n" fi

U slučaju posljednjeg «Elif»Pročitat će se mnogi uvjeti. U slučaju da se ovaj postupak pojednostavljuje:

VAR1 = $ 1 slučaj $ VAR u 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 ili 4, ovisi \ n" ;; *) printf "none \ n" ;; da je C

Čitat će se varijabla, u ovom slučaju VAR1, i vidjet će se je li ekvivalentna bilo kojem od slučajeva, ako ne, izvršit će se zadani slučaj "*". Dvostruke točke sa zarezom ekvivalentne su «razbiti«, Kažu«slučaj»To mora završiti.

«Spis»Može se koristiti i kao niz«if«, Za to morate upotrijebiti« ;; & »(nastaviti) umjesto« ;; » (Stop).

7. Petlje

Vrlo je malo petlji poznato u bilo kojem programskom jeziku. U Bashu su «dok„”dok»Y«za«. O ovome je već napisano u blogu:

Postoje dvije vrste petlji «za«, Oni koji su tipa«$ za VAR u LOQUESEA»A što su od tipa C«$ za ((I = 0; I <= 10; I ++))«. Druga vrsta petlji «za»Vrlo su korisni, ima 3 dijela na početku petlje:

  • Izjava i pokretanje varijabli (u ovom slučaju pomoćna varijabla "I = 0").
  • Uvjet izvršenja (sve dok ne budem manji ili jednak 10).
  • Povećanje pomoćne varijable

Po mom mišljenju to je najmoćnija petlja od svih. Primjer koji ispisuje sve brojeve od 0 do 10, uključujući:

#! / bin / bash za ((I = 0; I <= 10; I ++)); učiniti printf "$ I \ n" gotovo

8. Funkcije

Postoje neke stvari koje nam Bash ne dopušta, zar ne? Na prvi pogled bash funkcije sprječavaju vas da napravite 3 stvari: deklariranje lokalnih varijabli u funkcijama, prosljeđivanje parametara funkcijama i vraćanje parametara. Sve ima rješenje.

Ne radite ništa poput:

#! / bin / bash VAR = 1 printc "$ VAR \ n" funkcija pozdrav () {VAR = 2 printf "$ VAR \ n"} pozdrav printf "$ VAR \ n"

Ovo se ispisuje na zaslone 1, 2 i 2.

Da biste deklarirali lokalne varijable, dodajte «lokalne»Prilikom izjave:

#! / bin / bash VAR = 1 printf "$ VAR1 \ n" funkcija foo () {lokalni VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"

Ovo ispisuje 1, 1, 2, 1 na zaslon.

Kako prosljeđujete parametre funkciji?

#! / bin / bash # - * - KODIRANJE: UTF-8 - * - funkcija zdravo () {printf "Pozdrav $ 1 \ n"}

printf "Kako se zoveš? \ n"
pročitajte VAR1
bok $ VAR1

Kako se vraćaju parametri?

#! / bin / bash # - * - KODIRANJE: UTF-8 - * - funkcija hello () {printf "Hello holita"} printf "Kako se zoveš? \ n" pročitaj VAR1 VAR1 = $ (hello) # EVO GDJE JE printf "$ VAR1 $ VAR2 \ n"

Kao što vidite, ovo ima dva nedostatka, možete vratiti samo jedan parametar, koji može biti vektor 😀, a ako želite vratiti parametar, više ne možete ispisivati ​​na ekranu iz te funkcije.

Više stvari o funkcijama možete pronaći na [url=https://blog.desdelinux.net/programando-en-bash-parte-3/]ovaj članak s Usemoslinuxa[/url].

9. Getopi

Jedna od posljednjih stvari koje trebate znati o Bashu za stvaranje složenih skripti je «getopi«. Koristi se za prosljeđivanje opcija skripti bez obzira na redoslijed. Jedina mana je što utječe samo na kratke opcije:

#! / bin / bash # - * - KODIRANJE: UTF-8 - * - VARC = 0 funkcija help () {printf "Poruka pomoći \ n" exit} ako [[-z $ 1]]; zatim pomozite fi dok getopts: ha: b: c OPT; učiniti slučaj $ OPT u h) pomoć ;; :) Pomozite ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) Pomozite ;; esac done # Glavni blok skripte koji # radi stvari s VARA, VARB i VARC

«getopts»Čita opcije jednu po jednu, pa je potrebna petlja.

Postoje 2 vrste opcija koje se mogu proslijediti pomoću «getopti„:

  • Parametri zvani zastave, u ovom slučaju -c ili -h. Navedeni su slovom koje želimo koristiti. Oni su poput logičkih varijabli, «istinski»(Jesu) ili«lažan"(Oni nisu ovdje).
  • Parametri s pridruženim argumentima, -a bilo što, -b bilo što. Navedeni su slovom koje želimo s dvotačkom u nastavku. Argument je pohranjen u OPTARG (ovo je ime nepromjenjivo).
Početne dvostruke točke ne pokazuju pogreške.

Što radi ova skripta?

Prikazuje poruku pomoći kada nije proslijeđena nijedna opcija, kada je proslijeđen parametar "-h", kada je proslijeđen nevažeći parametar (na primjer "-x", to čini "\?") Ili kada je važeći parametar argument (":"). U ostalim slučajevima sprema prisutnost "-c" kao 1 u VARC, a vrijednosti proslijeđene s "-a" i "-b" u VARA i VARB.


Ostavite svoj komentar

Vaša email adresa neće biti objavljen. Obavezna polja su označena s *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obvezi.
  5. Pohrana podataka: Baza podataka koju hostira Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   živo dijo

    MAJSTORSKI. Ne kažem više U_U

  2.   Miguel dijo

    Pozdrav, jako dobar članak.
    Hej, stavili ste da date dozvole sudo + x umjesto chmod + x

    1.    Henri dijo

      $ sudo chmod + x script.sh
      (Točnije, hehe)

      Ah, čestitam i hvala!

  3.   vatrogasna dijo

    Vrlo dobar post, zaista vam čestitam, nastavite tako, pozdrav

  4.   Gustavo dijo

    A ako želite da skripta bude vidljiva kad se izvrši, korak po korak, vidjevši na primjer kako se ponašaju varijable, uvjeti i sve drugo, možete koristiti:

    skripta sh -x

    pozdravi

  5.   nadimak za Talijane, Špance dijo

    KOMAD tutorstva. Izvrsno i vrlo dobro objašnjeno.
    Hvala Vam.

  6.   Gabriel dijo

    Odličan post na tu temu 😉

  7.   Mario Guillermo Zavala Silva dijo

    Vrlo zanimljivo i važno, hvala na informacijama ...
    ŽIVJELI !!!

  8.   Ne iz Brooklyna dijo

    Hvala svima na čestitkama, što se tiče zapovijedi Miguel, ne dopušta mi da izmijenim unos nakon što se objavi. Morat ću to učiniti, pretpostavljam.

  9.   Adrian dijo

    Vrlo dobro!

    Prije svega, želio sam vam čestitati na postu, bilo mi je lako razumjeti i stvarno pomaže slijediti smjernice za dobro programiranje u bashu, posebno za ljude koji počinju programirati.

    Međutim, pronašao sam nekoliko detalja koje mislim da bi trebalo ispraviti.

    Prvo: u odjeljku «2. STRUKTURA SKRIPTA »funkcija nije zatvorena, što će uzrokovati probleme prilikom izvršavanja u skripti.
    Rješenje bi bilo dodati joj zatvarač odmah nakon naredbe "exit".

    Drugo: u odjeljku «4. PROČITAJTE KORISNIČKI ULAZ “potvrđujete da se parametri koje korisnik može unijeti kreću od 0 do beskonačno, međutim,„ bash “će tumačiti samo od 0 do 9 dolara, jer bi 10 dolara bilo jednako 1 USD + 0.
    Da biste riješili ovaj problem, možete upotrijebiti naredbu "shift" da biste zgrabili sljedeće varijable. Ili navedite varijablu u zagradama "$ {10}", tako da bash uzima vrijednosti zajedno, a ne kao $ 1 + 0.

    Bez daljnjeg, pozdrav!

    1.    Ne iz Brooklyna dijo

      Hvala na komentaru. Potpuno nije uspio objasniti ispravnu upotrebu izlaza, kako u skripti, tako i u funkcijama. Što se tiče {10} dolara, nikada nisam toliko zavještao, pa nisam naišao na taj problem, dobro je znati da za to postoji rješenje (već sam prekrižio novu stvar koja sam danas naučio 😀).

  10.   chanio dijo

    Puno vam hvala na članku! Neke stvari koje spominjete još uvijek nisu imale pojašnjenja. Na primjer, getops.
    U dijelu izlaza sa zaslona morali ste spomenuti mačku koju kasnije spominjete ...
    mačka <
    ***************************************
    * OVAJ OBRAZAC JE VRLO IZRAZIT *
    ***************************************
    EOF

    U vašem primjeru:
    mačka << EOF >> test.sh
    Treba spomenuti dvije stvari ... >> to je 'dodaj', odnosno ako ponovite istu naredbu, imat ćete cijelu skriptu u duplikatu ... Trebali biste koristiti samo jednu ...
    mačka << EOF> script.sh
    Da, trebao bi se zvati i script.sh
    Zatim u
    ako [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoć"]]; zatim
    pomoći
    fi

    Mislim da bi to trebalo napisati ...
    ako [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoć"]]; zatim
    ...

    Iz BASH-a možete otkriti još mnogo toga.
    Možete li ga nasloviti "OSNOVE"? 🙂
    Na primjer, parametar 'testeri' poput -z da vidi jesu li prazni ili -f da vidi postoji li kao datoteka.

    Hvala još jednom na vašem trudu.
    Alberto

  11.   clow_eriol dijo

    Vrlo dobar tutorial bash skripte!

  12.   OCZ dijo

    -- KODIRANJE: UTF-8 --

    To je prvi put da vidim taj redak za postavljanje kodiranja znakova u bash skripti. Čini mi se više kao Python nego Bash. Je li stvarno potrebno? Potražio sam referencu na Googleu, ali ne mogu pronaći ništa, imate li pri ruci vezu koja govori o ovom pitanju? Konkretno o prikladnosti te linije.

    Po mom mišljenju, za pisanje skripti u Bashu pomoću UTF-8 trebate samo spremiti tekstualnu datoteku kao takvu (bez BOM-a) i imati ispravno postavljene određene varijable okruženja (LANG i LC_ *).
    Tada je, očito, potrebno da se izvršene naredbe pripreme za kodiranje osim ASCII. Na primjer, ako želimo preći na velika slova, čini se da ovo ne funkcionira:
    «Echo áéíóú | tr az AZ »
    o:
    «Echo áéíóú | tr [: donji:] [: gornji:] »
    i bolje je koristiti:
    «Echo áéíóú | awk '{print toupper ($ 0)}' ».

    1.    Ne iz Brooklyna dijo
    2.    borriquito poput tebe dijo

      Netko me ispravio, ali ta linija kodiranja (# -- KODIRANJE: UTF-8 --) To nema nikakve veze s bashom ili ljuskom: to je redak komentara (započinje s #) i služi za uređivanje UREDNIKA koji koristimo za pisanje skripte (vim, emacs ...) kodiranja datoteke.

      Zapravo, bash ne vidi takav redak, jer je to redak komentara.

  13.   JoRgE-1987 dijo

    Izvrsna lekcija, jer Sysadmin zna poznavanje skriptiranja u Bashu, što je korisno za sve.

    Jako jako dobro!

    Pozdrav!

  14.   Edward Cuomo dijo

    U slučaju da je nekome korisno, evo nekoliko načina i primjera za stvaranje vlastitih skripti: https://github.com/reduardo7/hsabx

  15.   Crni Lito dijo

    Vrlo dobro. Nove stvari koje treba dodati mojim skriptama. Stvar s encodig-om i printf-om to nisu imali.
    Hvala vam!!!

  16.   xxxtonixxx dijo

    Paoo dobar članak! Ovu držim za favorite, bilo bi lijepo ispraviti pogrešno i čak proširiti s više sadržaja. Pljesak za sve ove informacije !!!!