Bash teorija

/ bin / bash

0. Kazalo

  1. Stvari, ki se zgodijo večini ljudi
  2. Struktura scenarija
  3. Tiskanje na zaslon
  4. Preberite uporabnika INPUT
  5. Izračuni v bash
  6. Pogoji
  7. Zanke
  8. Funciones
  9. Getopi

1. Stvari, ki se zgodijo večini ljudi

/ bin / bash ali / bin / sh

Ena prvih stvari, ki jih stroj naredi pri izvajanju našega skripta, je preučevanje, s katero lupino naj to stori. V večini trenutnih sistemov Linux / Bin / sh je povezava do / bin / bash, vendar to ni vedno tako, na primer pri distribucijah, ki uporabljajo busybox prinašajo Sh in ponavadi tudi prinesejo Bash, če pa uporabljate / Bin / sh, ne bo tekel z Bashom. Zato priporočam vedno uporabo / bin / bash.

Unicode proti ASCII

Ste se kdaj vprašali, zakaj v svojih skriptah ne morete uporabiti "¿" ali "ñ"? Ali uporabite naglas? V interaktivnih skriptah je lahko precej moteče. To je zato, ker je privzeto kodiranje Basha ASCII ali kar je enako, angleški nabor znakov. Če ga želimo spremeniti, moramo samo skriptu povedati, da želimo uporabljati Unicode. Za to morate dodati vrstico takoj za tolmačem ukazov:

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

Bodite previdni, pomembno je, da je ta vrstica na začetku skripta.

Skript naj bo izvedljiv

Smešno je, koliko ljudi vodi skripte z «$ bashscript.sh" namesto "$ ./script.sh'Navsezadnje smo za to opredelili lupino.

Če želite dodati dovoljenja za izvajanje, morate izvesti:

sudo + x script.sh
Če je naš skript izvršljiv, ga lahko dodamo v naš PATH in naredimo izvršljiv od koder koli / mape v našem računalniku. Za to moramo dodati .bashrc našega uporabnika ali v / etc / bashrc vrstico
BIN = "mapa, v kateri imamo skripte" PATH = "$ BIN $ PATH"
Pravilo Bash je, da imena spremenljivk pišemo z velikimi črkami. Mnogi se tega pravila ne držijo, vendar je za dolge scenarije cenjen, ker so zaradi njih veliko bolj berljivi

2. Struktura scenarija

  1. Headboard
  2. Opredelitev globalnih spremenljivk
  3. Pomaga
  4. Funciones
  5. Glavni del

V glavi je označeno, katero lupino želimo uporabiti in kodiranje. Prednost funkcij je v ponovni uporabi kode, ki se ponovi tako, da jo napišete samo enkrat, in za lažje razumevanje skripta, saj je koda, ki presega 100 vrstic, zelo koristna.

Če želite uporabljati funkcije, jih je treba definirati s pred glavnim delom našega skripta. In če želimo spremenljivke uporabljati na globalni ravni celotnega skripta, tako v glavnem delu kot v funkcijah, jih moramo definirati na začetku vsega, takoj za glavo.

Nazadnje je dobra praksa, da napišemo pomožno funkcijo, kadar naš skript deluje slabo ali s slabimi parametri. Očitno je, da v teh primerih želimo skript takoj zapustiti, ne da bi prebrali funkcije. Za to lahko uporabimo:

function help () {echo "" "Naše dobro oblikovano besedilo pomoči." "" izhod, če [[-z $ 1 || $ 1 == "-h" || $ 1 == "--pomoč"]]; potem pomagaj fi

Če v funkcijo pomoči dodamo "izhod", bomo skript zapustili vsakič, ko zaženemo pomoč, na primer po sporočilih o napakah itd. Shranili smo nekaj vrstic kode.

Pogoj označuje pomoč na zaslonu in izhod, če se skript zažene brez parametrov ali če je podana -h / –help. Če pogledate, je to običajno vedenje večine programov Linux.

Uporaba 3 narekovajev z odmevom omogoča uporabo prelomov vrstic, ne da bi pustilo, da sporočilo prikaže echo. Za večvrstična sporočila je veliko bolj priročno uporabljati odmev samo enkrat.

3. Natisnite na zaslon

Obstajata 2 glavna ukaza za tiskanje na zaslon v bash: «echo"Y"printf«. Oba sta enako hitra in oba sta del basha. Glavna razlika za začetnike je ta, da odmev na koncu doda novo vrstico, medtem ko «printf»Ne.

Echo je zelo dober in je tisto, kar večina ljudi uporablja, vendar se pri branju uporabnikovega INPUT-a ali kadar želite natisniti spremenljivke, vzete iz datotek z obdelavo besedil, lahko zgodijo nenavadne stvari. Običajno jih je enostavno rešiti, tako enostavno, kot da spremenite dvojne narekovaje v enojne ali obratno ali odstranite sklice spremenljivk iz narekovajev. «Echo»Ali so čudne stvari odvisne tudi od tega, kako je bil sestavljen, če vedno uporabljamo Ubuntu ali vedno Fedoro, to ne vpliva na nas, če pa spremenimo distribucijo, to počne.

Zato uporabljam «printf«, Ki me ne boli glavobolov in se tudi obnaša bolj kot«printf»Od C ali«print»Za Python je to zelo pomembno, če želite kdaj svoj skript prenesti v drug programski jezik.

Za obsežnejšo razpravo lahko obiščete to vprašanje od Unixa in Linuxa na Stack Exchange.

4. Preberite VHOD uporabnika

Vse, kar napišemo po imenu našega skripta in preden pritisnemo tipko ENTER, se samodejno shrani v posebne spremenljivke. Te spremenljivke so tipa $ X, kjer je X število.

«$0»Označuje ime našega skripta in od«$1»Do neskončnosti je vse, kar smo pozneje zapisali, spremenljivo. Na primer:

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

Ustvarimo testni skript, naredimo ga izvedljiv in ga zaženemo z 2 parametroma. Na zaslonu dobimo:

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

Z navednicami bi lahko datoteko "my file.txt" predali v "$ 1".

Prav tako lahko z ukazom "read" preberemo INPUT uporabnika, ki neposredno označi spremenljivko, kam želimo shraniti parameter. Na primer:

printf "Kako ti je ime? \ n" preberi IME printf "Pozdravljeni, $ NAME. \ n"
Bodite previdni pri dodeljevanju spremenljivk. "$ VAR = content" bo povzročil napako, med znakom enakosti, imenom spremenljivke in vsebino ne sme biti presledkov. Pravilna uporaba je "VAR = vsebina"

5. Izračuni v Bashu

Za to lahko uporabimo «ekspr«, Dokler nam ni treba delati zapletenih izračunov. Treba je opozoriti na dve stvari, prva je, da «ekspr»Dovoli samo cela števila, druga pa je, da delitev vrne celoten rezultat, da vidimo ostalo, kar lahko uporabimo«%".

Običajno želimo rezultat expr dodeliti spremenljivki. To lahko storimo na dva načina:

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

Lahko tudi preskočite «ekspr»Uporaba dvojnih oklepajev:

VAR2 = $ (($ VAR1 / 100))
Za nadaljnjo razlagoekspr»Ali alternativo, ki uporablja cele številke, si lahko ogledate ta vnos v KZKG ^ gaara.

6. Pogoji

Že zelo obširno je pisalo o «if«,«ostalo«,«elif»In pogoji. O tem si lahko preberete v:

Želim samo poudariti razliko med uporabo preprostih oglatih oklepajev, «[]«, In dvojni oklepaji,«[[]]«, Za pogoje. Z dvojnimi oklepaji lahko uporabimo dodatne pogoje:

  • «&&»Za in
  • «||»Za oz

Uporabiti "&&"Y"||»Pri enostavnih oglatih oklepajih je treba vsak del ločiti v ločenih oklepajih. Primer, ki se uporablja za del skripta, v katerem je videti, ali je treba zagnati pomoč, bi bil:

če je [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- pomoč"]]; potem pomagaj fi

Prav tako nas reši pred pisanjem imen spremenljivk v narekovaje, da preprečimo napake. Na primer:

če je [$ 1 = 1]; nato printf "Parameter je enak 1."; fi, če ["$ 1" = 1]; nato printf "Parameter je enak 1."; fi, če [[$ 1 = 1]]; nato printf "Parameter je enak 1."; fi

Če se script.sh zažene brez kakršnih koli parametrov, bo prvi primer dal napako:

bash: [: =: pričakuje se unarni operater
V jeziku Bash se "=" in "==" razlagata na enak način. To se ne zgodi v drugih programskih jezikih, kjer se "=" uporablja samo za dodelitev spremenljivk.

O čem se še ni govorilo, «primeru«, Uporablja se za poenostavitev«if«. Začnimo na začetku, ko jih še nimamo «if»Vsa koda bo izvedena. Če dodamo pogoj «if»Imeli bomo dva primera, v enem bo blok kode, ki je znotrajif»In drugi primer, ko se ta blok ne izvede.

Če dodamo «ostalo«Imeli bomo tudi dva primera, vendar se ta dva primera razlikujeta od prejšnjih. Ker bosta zdaj dva pogojna bloka kode, A in B, ter blok C, kar je preostali del programa. Izvedena bo A ali B in C. V prejšnjem primeru sta bila to A in C ali samo C.

Da bi se izognili pogojem pisanja «če potem"znotraj"ostalo»In za poenostavitev branja kode je bila ustvarjena«elif«. Ko imamo veliko pogojev, ki so odvisni od prejšnjega, na primer obseg številk ali vrsto:

VAR1 = 1 $, če [[$ VAR1 = 1]]; nato natisnitef "1 \ n" elif [[$ VAR1 = 2]]; nato natisnitef "2 \ n" elif [[$ VAR1 = 3]]; nato printf "3 \ n" sicer printf "noben \ n" fi

V primeru zadnjega «elif»Prebranih bo veliko pogojev. V primeru, da se ta postopek poenostavi:

VAR1 = $ 1 primer $ VAR v 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 ali 4, odvisno \ n" ;; *) printf "nič \ n" ;; da je C

Prebrala se bo spremenljivka, v tem primeru VAR1, in preverila se bo, ali je enakovredna kateremu od primerov, v nasprotnem primeru se izvede privzeti primer "*". Dvojni podpičji so enakovredniodmor«, Povedo«primeru»To se mora končati.

«Zadeva»Lahko se uporablja tudi kot zaporedje«if«, Za to morate uporabiti« ;; & »(nadaljevanje) namesto« ;; » (stop).

7. Zanke

Zelo malo zank je znanih v katerem koli programskem jeziku. V Bashu so «medtem«,«dokler"Y"za«. O teh je že bilo zapisano v blogu:

Obstajata dve vrsti zank «za«, Tiste vrste»$ za VAR v LOQUESEA»In kaj so vrste C«$ za ((I = 0; I <= 10; I ++))«. Druga vrsta zank «za»So zelo koristni, na začetku zanke so 3 deli:

  • Izjava in začetek spremenljivk (v tem primeru pomožna spremenljivka "I = 0").
  • Pogoj izvršitve (dokler I ni manjši ali enak 10).
  • Povečanje pomožne spremenljivke

Po mojem mnenju je to najmočnejša zanka med vsemi. Primer, ki natisne vse številke od 0 do vključno 10:

#! / bin / bash za ((I = 0; I <= 10; I ++)); naredi printf "$ I \ n" končano

8. Funkcije

Nekaterih stvari nam Bash ne dovoli, kajne? Na prvi pogled funkcije bash preprečujejo, da bi naredili tri stvari: deklariranje lokalnih spremenljivk v funkcijah, posredovanje parametrov funkcijam in vračanje parametrov. Vse ima rešitev.

Ne delajte ničesar podobnega:

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

To se natisne na zaslone 1, 2 in 2.

Če želite prijaviti lokalne spremenljivke, dodajte «lokalna»Pri izjavi:

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

To natisne 1, 1, 2, 1 na zaslon.

Kako posredujete parametre funkciji?

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

printf "Kako ti je ime? \ n"
preberite VAR1
živjo $ VAR1

Kako se vrnejo parametri?

#! / bin / bash # - * - KODIRANJE: UTF-8 - * - funkcija hello () {printf "Hello holita"} printf "Kako ti je ime? \ n" beri VAR1 VAR1 = $ (hello) # TUKAJ JE printf "$ VAR1 $ VAR2 \ n"

Kot lahko vidite, ima to dve pomanjkljivosti, lahko vrnete samo en parameter, ki je lahko vektor 😀, in če želite vrniti parameter, iz te funkcije ne morete več tiskati na zaslon.

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. Getopi

Ena zadnjih stvari, ki jih morate vedeti o Bashu za ustvarjanje zapletenih skriptov, je «getopi«. Uporablja se za posredovanje možnosti skriptu ne glede na vrstni red. Edina slabost je, da vpliva samo na kratke možnosti:

#! / bin / bash # - * - KODIRANJE: UTF-8 - * - VARC = 0 funkcija help () {printf "Sporočilo o pomoči \ n" izhod}, če [[-z $ 1]]; nato pomagajte fi, medtem ko getopts: ha: b: c OPT; do primera $ OPT v h) pomoč ;; :) pomoč ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) pomoč ;; esac done # Glavni blok skripta, ki # dela stvari z VARA, VARB in VARC

«getopts»Prebere možnosti eno za drugo, zato je potrebna zanka.

Obstajata dve vrsti možnosti, ki jih je mogoče prenesti z «getopts":

  • Parametri, imenovani zastave, v tem primeru -c ali -h. Določeni so s črko, ki jo želimo uporabiti. So kot logične spremenljivke, «Res»(Are) ali«false"(Niso tukaj).
  • Parametri s pripadajočimi argumenti, -a kaj, -b karkoli. Določeni so s črko, ki jo želimo, z dvopičjem spodaj. Argument je shranjen v OPTARG (to ime je nespremenljivo).
Začetne dvojne točke ne kažejo napak.

Kaj naredi ta skript?

Prikaže sporočilo o pomoči, ko ni posredovana nobena možnost, ko je poslan parameter "-h", ko je poslan neveljaven parameter (na primer "-x", to naredi "\?") Ali kadar veljaven parameter prepir (":"). V ostalih primerih shrani prisotnost "-c" kot 1 v VARC in vrednosti, posredovane z "-a" in "-b" v VARA in VARB.


Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Za podatke odgovoren: Miguel Ángel Gatón
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.

  1.   živahno je dejal

    VELIKO. Ne rečem več U_U

  2.   Miguel je dejal

    Pozdravljeni, zelo dober članek.
    Hej, dal si dovoljenja sudo + x namesto chmod + x

    1.    Henry je dejal

      $ sudo chmod + x script.sh
      (Natančneje, hehe)

      Ah, čestitke in hvala!

  3.   ognjevarno je dejal

    Zelo dobra objava, resnično vam čestitam, nadaljujte tako, Lep pozdrav

  4.   Gustavo je dejal

    Če želite, da je skript viden, ko se izvaja, korak za korakom, na primer, kako se vedejo spremenljivke, pogoji in vse, lahko uporabite:

    skript sh -x

    pozdrav

  5.   tam je dejal

    KOMAD tutorstva. Odlično in zelo dobro razloženo.
    Hvala.

  6.   Gabriel je dejal

    Odlična objava na to temo 😉

  7.   Mario Guillermo Zavala Silva je dejal

    Zelo zanimivo in pomembno, hvala za informacije….
    NA ZDRAVJE !!!

  8.   Ne iz Brooklyna je dejal

    Hvala vsem za čestitke, saj za ukaz Miguel ne dovoli, da spremenim vnos, ko bo objavljen. Predstavljati bo treba, kot si predstavljam.

  9.   Adrián je dejal

    Zelo dobro!

    Najprej sem vam hotel čestitati za objavo, zdelo se mi je enostavno razumljivo in resnično pomaga slediti smernicam za dobro programiranje v bash, zlasti za ljudi, ki šele začnejo programirati.

    Vendar sem našel nekaj podrobnosti, za katere menim, da bi jih bilo treba popraviti.

    Prvič: v odseku «2. STRUKTURA SKRIPTA »funkcija ni zaprta, kar bo povzročalo težave pri izvajanju v skriptu.
    Rešitev bi bila, da dodate oklepaje takoj po ukazu "izhod".

    Drugič: v oddelku «4. PREBERITE UPORABNIŠKI VHOD «potrjujete, da se parametri, ki jih lahko uporabnik vnese, gibljejo od 0 do neskončnosti, vendar bo» bash «interpretiral le med 0 in 9 USD, saj bi bilo 10 USD enako 1 + 0 USD.
    Da bi rešili to težavo, lahko uporabite ukaz "shift", da zgrabite naslednje spremenljivke. Ali pa v oklepajih "$ {10}" določite spremenljivko, tako da bash vrednosti vzame skupaj, ne kot $ 1 + 0.

    Brez dodatnih besed, lep pozdrav!

    1.    Ne iz Brooklyna je dejal

      Hvala za vaš komentar. Popolnoma ni uspelo razložiti pravilne uporabe izhoda tako v skriptu kot v funkcijah. Kar zadeva {10} USD, še nikoli nisem toliko zapustil, zato nisem naletel na to težavo, dobro je vedeti, da za to obstaja rešitev (novo stvar, ki sem se je danes naučil, sem že prečrtal 😀).

  10.   chanio je dejal

    Najlepša hvala za članek! Nekatere stvari, ki jih omenjate, še vedno niso bile pojasnjene. Na primer, getops.
    V delu izhodov na zaslonu niste omenili mačke, ki jo kasneje omenjate ...
    mačka <
    ***************************************
    * TA OBRAZEC JE ZELO IZRAZITEN *
    ***************************************
    EOF

    V vašem primeru:
    mačka << EOF >> test.sh
    Omeniti je treba dve stvari ... >> to je "dodaj", to je, če ponovite isti ukaz, boste imeli celoten skript v dvojniku ... Uporabite le enega ...
    mačka << EOF> script.sh
    Da, imenoval bi se tudi script.sh
    Potem noter
    če je [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoč"]]; potem
    pomoč
    fi

    Mislim, da bi to moralo biti napisano ...
    če je [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoč"]]; potem
    ...

    Od BASH-a lahko odkrijete še veliko več.
    Bi ga lahko naslovili "OSNOVE"? 🙂
    Parameter »preizkuševalci« je na primer na primer -z, da preveri, ali so prazni, ali -f, da ugotovi, ali obstaja kot datoteka.

    Še enkrat hvala za vaš trud.
    Alberto

  11.   clow_eriol je dejal

    Zelo dobra vadnica za bash skripte!

  12.   ocz je dejal

    -- KODIRANJE: UTF-8 --

    To vrstico prvič vidim, da nastavim kodiranje znakov v skriptu bash. Zdi se mi bolj kot Python kot Bash. Je to res potrebno? Iskal sem referenco v Googlu, vendar ne najdem ničesar, ali imate pri roki povezavo, ki govori o tej zadevi? Natančneje glede primernosti te vrstice.

    Po mojem mnenju morate za pisanje skriptov v Bashu z uporabo UTF-8 samo shraniti besedilno datoteko kot tako (brez BOM) in imeti pravilno nastavljene nekatere spremenljivke okolja (LANG in LC_ *).
    Potem je očitno nujno, da so izvedeni ukazi pripravljeni za kodiranje, ki ni ASCII. Na primer, če želimo iti v velike črke, to ne deluje:
    «Echo áéíóú | tr az AZ »
    o:
    «Echo áéíóú | tr [: spodnji:] [: zgornji:] »
    in bolje je uporabiti:
    «Echo áéíóú | awk '{print toupper ($ 0)}' ».

    1.    Ne iz Brooklyna je dejal

      O «kodiranje»V tem blogu je bilo omenjeno že prej:

      Bash: kako narediti skript izvršljiv
      Skript pomožnega programa za namestitev

    2.    borriquito kot ti je dejal

      Nekdo me popravi, toda ta vrstica za kodiranje (# -- KODIRANJE: UTF-8 --) To nima nič skupnega z bash ali lupino: gre za vrstico s komentarji (začne se z #) in služi UREDNIKU, ki ga uporabljamo za pisanje skripta (vim, emacs ...) kodiranju datoteke.

      Pravzaprav bash ne vidi takšne vrstice, ker je vrstica za komentar.

  13.   JoRgE-1987 je dejal

    Odlična vadnica, saj je Sysadmin, ki pozna skriptiranje v Bashu, bistvenega pomena in je koristen za vse.

    Zelo zelo dobro!

    Lep pozdrav!

  14.   Edward Cuomo je dejal

    Če je komu koristen, je tukaj nekaj načinov uporabe in primerov za ustvarjanje lastnih skriptov: https://github.com/reduardo7/hsabx

  15.   Lito Black je dejal

    Zelo dobro. Nove stvari, ki jih moram dodati v moje skripte. Stvar encodig in printf je nista imela.
    Hvala vam!!!

  16.   xxxtonixxx je dejal

    Nooo dober članek! Tega obdržim med priljubljenimi, lepo bi bilo popraviti napačno in celo razširiti z več vsebinami. Aplavz za vse te informacije !!!!