Bashi teooria

/ bin / bash

0. Indeks

  1. Asjad, mis juhtuvad enamiku inimestega
  2. Skripti ülesehitus
  3. Ekraanile printimine
  4. Loe kasutaja INPUT
  5. Arvutused bash
  6. Tingimused
  7. Silmused
  8. funciones
  9. Getobid

1. Asjad, mis juhtuvad enamiku inimestega

/ bin / bash või / bin / sh

Üks esimesi asju, mida masin meie skripti käivitades teeb, vaatab, millise kestaga ta seda tegema peaks. Enamikes praegustes Linux-süsteemides / Bin / sh on link saidile / bin / bash, kuid see pole alati nii, näiteks levitustes, mis kasutavad bussikast nad toovad Sh ja tavaliselt nad ka toovad sisse lööma, kuid kui kasutate / Bin / sh, see ei tööta Bashiga. Sellepärast soovitan alati kasutada / bin / bash.

Unicode vs ASCII

Kas olete kunagi mõelnud, miks ei saa skriptides kasutada tähte "¿" või "ñ"? Või kasutada aktsente? Interaktiivsetes skriptides võib see olla üsna tüütu. Seda seetõttu, et Bashi vaikekodeering on ASCII või mis on sama, ingliskeelne tähemärk. Selle muutmiseks peame oma skriptile ütlema ainult, et soovime kasutada Unicode'i. Selleks peate lisama rea ​​vahetult pärast käsutõlki:

# - * - Kodeerimine: UTF-8 - * -

Olge ettevaatlik, on oluline, et see rida oleks skripti alguses.

Muutke skript käivitatavaks

See on naljakas, kui paljud inimesed käitavad skripte «$ bashscript.sh" selle asemel "$ ./script.sh"Lõppude lõpuks oleme selleks määranud kesta.

Täitmisõiguste lisamiseks peate käivitama:

sudo + x script.sh
Kui meie skript on käivitatav, saame selle lisada oma PATH-i ja muuta selle käivitatavaks kõikjalt / kaustast oma arvutis. Selleks peame lisama kas oma kasutaja .bashrc-faili või reale / etc / bashrc
BIN = "kaust, kus meil on skriptid" PATH = "$ BIN $ PATH"
Bashi reegel on muutujate nimede kirjutamine kogu suurtähega. Paljud inimesed ei järgi seda reeglit, kuid pikkade skriptide puhul on see teretulnud, sest need muudavad need palju loetavamaks

2. Skripti ülesehitus

  1. Peakoda
  2. Globaalsete muutujate määratlus
  3. Aitama
  4. funciones
  5. Põhikeha

Päises saab näidata, millist kestat me kasutada soovime, ja kodeeringut. Funktsioonide eeliseks on korduva koodi korduvkasutamine, kirjutades selle ainult üks kord, ja skripti mõistmise hõlbustamine, 100 rida ületava koodi puhul on see väga kasulik.

Funktsioonide kasutamiseks tuleb need määratleda enne meie skripti põhiosa. Ja kui tahame muutujaid kogu skripti ulatuses kasutada nii globaalsel tasandil, nii põhiosas kui ka funktsioonides, peame need määratlema kõige alguses, kohe pärast päist.

Lõpuks on hea tava kirjutada abifunktsioon, kui meie skript töötab halvasti või halbade parameetritega. Ilmselt soovime neil juhtudel skriptist kohe väljuda, funktsioone lugemata. Selleks saame kasutada:

function help () {echo "" "Meie hästi vormindatud abitekst." "" väljuge, kui [[-z $ 1 || $ 1 == "-h" || $ 1 == "--abi"]]; siis aita fi

Kui lisame abifunktsiooni "exit", väljume skriptist iga kord, kui käivitame abi, näiteks pärast veateateid jne. Salvestame mõned koodiread.

Tingimus näitab ekraanil kuvatavat abi ja väljumist, kui skript käivitatakse ilma parameetriteta või kui on määratud -h / –help. Kui vaatate, on see enamiku Linuxi programmide tavapärane käitumine.

Kolme kajaga jutumärgi kasutamine võimaldab kasutada reavahetusi jätmata sõnumit kajaga kuvama. Mitmerealiste sõnumite puhul on palju mugavam kasutada kaja ainult üks kord.

3. Printige ekraanile

Bashi ekraanil printimiseks on kaks peamist käsku: «miss»Ja«printf«. Mõlemad on sama kiired ja mõlemad on osa bashist. Peamine erinevus algaja jaoks on see, et kaja lisab lõpus uue rea, samas kui «printf"Ei ole.

Kaja on väga hea ja seda kasutavad enamik inimesi, kuid kasutaja sisendi lugemisel või kui soovite tekstitöötlusega failidest võetud muutujaid printida, võib juhtuda kummalisi asju. Need on tavaliselt hõlpsasti lahendatavad, sama lihtne kui topelt jutumärkide vahetamine üksikuteks või vastupidi või muutujate viited jutumärkidest välja võtmiseks. «Kaja»Kas kummalisi asju sõltub ka see, kuidas see kompileeriti, kui me kasutame alati Ubuntu või alati Fedorat, ei mõjuta see meid, kuid kui me muudame levitamist, mida see teeb.

Seetõttu kasutan ma «printf«, Mis ei valmista mulle peavalu ja käitub ka rohkem nagu«printf»Alates tähest C võitrükk»Pythoni puhul on see väga oluline, kui soovite kunagi oma skripti teisele programmeerimiskeelele teisaldada.

Põhjalikuma arutelu saamiseks võite külastada see küsimus Unixilt ja Linuxilt Stack Exchange'is.

4. Lugege kasutaja sisendit

Kõik, mida kirjutame pärast skripti nime ja enne klahvi ENTER vajutamist, salvestatakse automaatselt spetsiaalsetesse muutujatesse. Need muutujad on tüüpi $ X, kus X on arv.

«$0»Näitab meie skripti nime ja$1»Lõpmatuseni on kõik, mida oleme hiljem kirjutanud, muutlik. Näiteks:

kass << EOF >> test.sh #! / bin / bash # - * - Kodeering: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n" EOF chmod + x script.sh ./script.sh minu fail.txt

Loome testskripti, muudame selle käivitatavaks ja käivitame selle 2 parameetriga. Saame ekraaniväljundi:

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

Jutumärke kasutades oleksime võinud "my file.txt" edastada "$ 1".

Samuti võime lugeda kasutaja sisendit käsuga "read", näidates otseselt muutujat, kuhu soovime parameetri salvestada. Näiteks:

printf "Mis su nimi on? \ n" loe nime printf "Tere, $ NAME. \ n"
Muutujate määramisel olge ettevaatlik. "$ VAR = content" põhjustab vea, võrdusmärgi, muutuja nime ja sisu vahele ei saa jätta tühikuid. Õige kasutamine on "VAR = content"

5. Arvutused Bashis

Selleks saame kasutada «ekspr«, Kuni me ei pea tegema keerukaid arvutusi. Tuleb märkida kahte asja, esimene on see, et «ekspr»Tunnistab ainult täisarvusid, teine ​​on see, et jagamine tagastab kogu tulemuse, ülejäänud nägemiseks saame kasutada«%"

Tavaliselt tahame expr tulemuse määrata muutujale. Saame seda teha kahel viisil:

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

Võite ka vahele jätta «ekspr»Topelsulgude kasutamine:

VAR2 = $ (($ VAR1 / 100))
Täiendava selgituse saamiseks «ekspr»Või võite vaadata tervet numbrit kasutavat alternatiivi see KZKG ^ gaara kirje.

6 Tingimused

Sellest on juba väga ulatuslikult kirjutatud «if","teine","elif»Ja tingimused. Selle kohta saate lugeda:

Tahan lihtsalt välja tuua erinevuse lihtsate nurksulgude kasutamise vahel, «[]«Ja kahekordsed sulgud,«[[]]«, Tingimuste jaoks. Topeltklambritega saame kasutada täiendavaid tingimusi:

  • «&&»Poolt ja
  • «||»Kas või

Kasutada "&&»Ja«||»Lihtsate nurksulgudega tuleks iga osa eraldada eraldi nurksulgudesse. Skripti selle osa kohta, mida vaadatakse, kas abi tuleb käivitada, kasutatakse näiteks:

kui [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--abi"]]; siis aita fi

See säästab meid ka vigade vältimiseks muutujate nimede jutumärkidesse kirjutamisest. Näiteks:

kui [$ 1 = 1]; siis printf "Parameeter on võrdne 1-ga"; fi kui ["$ 1" = 1]; siis printf "Parameeter on võrdne 1-ga"; fi kui [[$ 1 = 1]]; siis printf "Parameeter on võrdne 1-ga"; fi

Kui script.sh käivitatakse ilma parameetriteta, annab esimene juhtum vea:

bash: [: =: eeldatav ühekordne operaator
Bashi keeles tõlgendatakse mõisteid "=" ja "==" ühtemoodi. Seda ei juhtu teistes programmeerimiskeeltes, kus "=" kasutatakse ainult muutujate määramiseks.

Sellest, millest pole räägitud, on «juhul«, Kasutatakse lihtsustamiseks«if«. Alustame algusest, kui meil pole ühtegiif»Kogu kood käivitatakse. Kui lisame tingimuse «if»Meil on kaks juhtumit, millest üks on koodiplokk, mis asubif»Ja teine ​​juhtum, kus seda blokeeringut ei täideta.

Kui lisameteine«Meil tuleb ka kaks juhtumit, kuid need kaks juhtumit erinevad eelmistest. Sest nüüd saab olema kaks tingimuslikku koodiplokki, A ja B ning C-plokk, mis on ülejäänud programm. A või B täidetakse ja C. Eelmisel juhul olid need A ja C või ainult C.

Kirjutamistingimuste vältimiseks «kui / veel"sees"teine»Ja lihtsustage koodi lugemist, see loodi«elif«. Kui meil on palju tingimusi, mis sõltuvad eelmisest, näiteks arvude vahemik või tüüp:

VAR1 = $ 1, kui [[$ VAR1 = 1]]; siis printf "1 \ n" elif [[$ VAR1 = 2]]; siis printf "2 \ n" elif [[$ VAR1 = 3]]; siis printf "3 \ n" muul printf "puudub \ n" fi

Viimase «elif»Loetakse paljusid tingimusi. Juhul, kui see protsess on sujuvam:

VAR1 = $ 1 juhtum $ VAR 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 või 4, see sõltub \ n" ;; *) printf "pole \ n" ;; et C

Loetakse muutuja, antud juhul VAR1, ja nähakse, kas see on samaväärne mõne juhtumiga, kui ei, siis käivitatakse vaikimisi juhtum "*". Topelt semikoolonid on samaväärsedmurdma«, Nad ütlevad«juhul»See peab lõppema.

«juhtum»Võib kasutada ka järjena«if«, Selleks peate sõna« ;; »asemel kasutama« ;; & »(jätkake) (peatus).

7. Silmused

Igas programmeerimiskeeles on teada väga vähe tsükleid. Bashis on nadkuigi","kuni»Ja«eest«. Nendest on blogis juba kirjutatud:

Silmuseid on kahte tüüpi «eest«, Need, kes on seda tüüpi$ VAR eest LOQUESEA-s»Ja mis on C-tüüpi$ for ((I = 0; I <= 10; I ++))«. Teist tüüpi silmused «eest»On väga kasulikud, sellel on tsükli alguses 3 osa:

  • Muutujate deklareerimine ja algatamine (antud juhul abimuutuja "I = 0").
  • Täitmise tingimus (kuni I on väiksem või võrdne 10).
  • Abimuutuja suurenemine

Minu arvates on see kõige võimsam silmus. Näide, mis prindib kõik numbrid vahemikus 0 kuni 10 (kaasa arvatud):

#! / bin / bash ((I = 0; I <= 10; I ++)) jaoks; tee printf "$ I \ n" valmis

8. Funktsioonid

On asju, mida Bash ei luba meil teha, eks? Esmapilgul takistavad bashi funktsioonid teil teha kolme asja: kohalike muutujate deklareerimine funktsioonides, parameetrite edastamine funktsioonidele ja parameetrite tagastamine. Igal asjal on lahendus.

Ärge tehke midagi sellist:

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

See prindib ekraanidele 1, 2 ja 2.

Kohalike muutujate deklareerimiseks lisage «kohalik»Deklareerimisel:

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

Sellega prinditakse ekraanile 1, 1, 2, 1.

Kuidas edastate funktsioonile parameetreid?

#! / bin / bash # - * - Kodeerimine: UTF-8 - * - funktsioon tere () {printf "Tere $ 1 \ n"}

printf "Mis su nimi on? \ n"
loe VAR1
tere $ VAR1

Kuidas parameetrid tagastatakse?

#! / bin / bash # - * - Kodeerimine: UTF-8 - * - funktsioon tere () {printf "Hello holita"} printf "Mis su nimi on? \ n" loe VAR1 VAR1 = $ (tere) # SIIN ON printf "$ VAR1 $ VAR2 \ n"

Kuna näete, et sellel on kaks puudust, saate tagastada ainult ühe parameetri, mis võib olla vektor 😀 ja kui soovite parameetri tagastada, ei saa te sellest funktsioonist enam ekraanile printida.

Funktsioonide kohta leiate rohkem teavet aadressilt [url=https://blog.desdelinux.net/programando-en-bash-parte-3/]see Usemoslinux'i artikkel[/url].

9. Getopsid

Üks viimaseid asju, mida peate keeruliste skriptide loomiseks Bashi kohta teadma, on «getops«. Seda kasutatakse skriptile valikute edastamiseks olenemata järjekorrast. Ainus negatiivne külg on see, et see mõjutab ainult lühikesi valikuid:

#! / bin / bash # - * - Kodeerimine: UTF-8 - * - VARC = 0 funktsiooni abi () {printf "Abisõnum \ n" exit} kui [[-z $ 1]]; siis aita fi ajal getopts: ha: b: c OPT; tee juhtum $ OPT h) abi ;; :) abi ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1; \?) abi ;; esac done # Skripti peamine plokk, mis # teeb asju VARA, VARB ja VARC-ga

«getopts»Loeb valikuid ükshaaval, nii et on vaja silmust.

Kasutades «saab kasutada kahte tüüpi valikuidgetopts":

  • Parameetrid, mida nimetatakse lippudeks, antud juhul -c või -h. Need on täpsustatud tähega, mida soovime kasutada. Need on nagu Boole'i ​​muutujad, «tõsi»(Are) või«vale"(Neid pole siin).
  • Seotud argumentidega parameetrid, -a kõik, -b kõik. Need on täpsustatud tähega, mida soovime, kooloniga allpool. Argument on salvestatud OPTARG-i (seda nime ei saa muuta).
Esialgsed topeltpunktid ei näita vigu.

Mida see skript teeb?

Kuvatakse abisõnum, kui ühtegi valikut ei edastata, kui parameeter "-h" on edastatud, kui vale parameeter on edastatud (näiteks "-x", seda teeb "\?") Või kui kehtiv parameeter ilma argument (":"). Kõigil muudel juhtudel salvestab see "-c" olemasolu 1-na VARC-is ja VARA-s ja VARB-is "-a" ja "-b" abil edastatud väärtused.


Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.

  1.   elav DIJO

    Meisterlikult. Ma ei ütle rohkem U_U

  2.   Miguel DIJO

    Tere, väga hea artikkel.
    Tere, et paned õigused sudo + x asemel chmod + x

    1.    Henry DIJO

      $ sudo chmod + x script.sh
      (Täpsemalt öeldes, hehe)

      Ah, palju õnne ja aitäh!

  3.   tulekolde DIJO

    Väga hea postitus, ma tõesti õnnitlen teid, hoidke seda, Tervitused

  4.   Gustavo DIJO

    Ja kui soovite, et skript oleks käivitamisel nähtav, saate samm-sammult vaadata, kuidas muutujad, tingimused ja kõik käituvad, saate kasutada järgmist:

    sh -x skript

    seoses

  5.   mustavereline välismaalane DIJO

    TÜPIKOOS. Suurepärane ja väga hästi selgitatud.
    Gracias.

  6.   Gabriel DIJO

    Suurepärane postitus sellel teemal 😉

  7.   Mario Guillermo Zavala Silva DIJO

    Väga huvitav ja väga oluline tänu teabe eest ...
    CHEERS !!!

  8.   Mitte Brooklynist DIJO

    Tänan teid kõiki õnnitluste eest. Mis puutub Migueli käsklusse, siis ta ei luba mul seda kirjet pärast avaldamist muuta. See peab tegema elav, ma kujutan ette.

  9.   Adrian DIJO

    Väga hea!

    Kõigepealt tahtsin teid õnnitleda postituse puhul, minu arvates oli seda hõlpsasti mõistetav ja see aitab tõesti järgida juhiseid, et bashis hästi programmeerida, eriti inimestele, kes hakkavad programmeerima.

    Siiski olen leidnud paar detaili, mida minu arvates tuleks parandada.

    Esiteks: jaotises «2. Skripti ülesehitus »funktsioon pole suletud, mis tekitab probleeme skripti käivitamisel.
    Lahendus oleks lisada sulgemissulg kohe pärast käsku "exit".

    Teine: jaotises «4. LUGEGE KASUTAJASISENDIT ”kinnitate, et parameetrid, mille kasutaja saab sisestada, jäävad vahemikku $ 0 kuni lõpmatuseni, aga“ bash ”tõlgendab ainult vahemikus $ 0 kuni $ 9, kuna $ 10 võrdub $ 1 + 0.
    Selle probleemi lahendamiseks võite kasutada järgmiste muutujate haaramiseks käsku "shift". Või määrake muutuja sulgudes "$ {10}", nii et bash võtab väärtused kokku, mitte kui $ 1 + 0.

    Ilma pikema jututa tervitused!

    1.    Mitte Brooklynist DIJO

      Täname kommentaari eest. See ei suutnud täielikult selgitada väljumise õiget kasutamist nii skriptis kui ka funktsioonides. Mis puudutab dollarit {10}, siis pole ma kunagi nii palju pärandanud, nii et ma pole selle probleemiga kokku puutunud, on hea teada, et sellele on lahendus olemas (ma olen juba täna uue õpitud asja maha joonistanud 😀).

  10.   chanio DIJO

    Suur aitäh artikli eest! Mõnes teie mainitud asjas jäi veel selgitamata. Näiteks getops.
    Ekraaniväljundite osas pidite mainima kassi, keda hiljem mainisite ...
    kass <
    ***************************************
    * See vorm on väga väljendusrikas *
    ***************************************
    EOF

    Teie näites:
    kass << EOF >> test.sh
    Tuleb mainida kahte asja ... >> see on 'lisa ", st kui kordate sama käsku, on kogu skript kahes eksemplaris ... Peaksite kasutama ainult ühte ...
    kass << EOF> skript.sh
    Jah, seda tuleks nimetada ka script.sh
    Siis sisse
    kui [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- abi"]]; siis
    aitama
    fi

    Ma arvan, et see peaks olema kirjutatud ...
    kui [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- abi"]]; siis
    ...

    BASHist on palju muud avastada.
    Kas saaksite selle pealkirjaks panna "PÕHIMÕTTED"? 🙂
    Näiteks parameetrile 'testijad' meeldib -z, et näha, kas need on tühjad, või -f, et näha, kas see eksisteerib failina.

    Täname veelkord pingutuste eest.
    alberto

  11.   clow_eriol DIJO

    Väga hea bashi skripti õpetus!

  12.   oksi DIJO

    -- Kodeerimine: UTF-8 --

    Esimest korda näen seda rida, et määrata bash-skripti märkide kodeering. See tundub Pythonile tüüpilisem kui Bash. Kas see on tõesti vajalik? Olen otsinud Google'ist viidet, kuid ma ei leia midagi. Kas teil on käepärast link, mis sellest teemast räägib? Täpsemalt selle liini sobivuse kohta.

    Minu arvates tuleb Bashi skriptide kirjutamiseks UTF-8 abil salvestada ainult tekstifail kui selline (ilma BOMita) ja teatud keskkonnamuutujad (LANG ja LC_ *) õigesti seadistatud.
    Siis on ilmselt vajalik, et täidetud käsud oleksid ette valmistatud muudeks kodeeringuteks kui ASCII. Näiteks kui me tahame minna suurtähte, ei tundu see toimivat:
    «Kaja áéíóú | tr az AZ »
    o:
    «Kaja áéíóú | tr [: alumine:] [: ülemine:] »
    ja parem on kasutada:
    «Kaja áéíóú | awk '{print toupper ($ 0)}' ».

    1.    Mitte Brooklynist DIJO

      Umbes "kodeerimine»Seda blogi on varem mainitud:

      Bash: kuidas skript käivitatavaks muuta
      Installimisjärgse utiliidi skript

    2.    borriquito nagu sina DIJO

      Keegi parandas mind, kuid see kodeeriv rida (# -- Kodeerimine: UTF-8 --) Sellel pole midagi pistmist bashi ega shelliga: see on kommentaaririda (algab numbriga #) ja on mõeldud redigeerijale ütlema, et me kirjutame skripti (vim, emacs ...) faili kodeeringut.

      Tegelikult Bash sellist rida ei näe, sest see on kommentaaririda.

  13.   JoRgE-1987 DIJO

    Suurepärane õpetus, kuna Sysadmin oskab Bashis skriptimist, on see kasulik kõigeks.

    Väga väga hea!

    Tervitused!

  14.   Edward Cuomo DIJO

    Kui see on kellelegi kasulik, on siin oma skriptide loomiseks mitu kasutamist ja näidet: https://github.com/reduardo7/hsabx

  15.   Must Lito DIJO

    Väga hea. Uusi asju, mida minu skriptidesse lisada. Kodeerimises ja printf-asjas seda polnud.
    Aitäh!!!

  16.   xxxtonixxx DIJO

    Niiii ​​hea artikkel! Hoian seda lemmikute jaoks, oleks tore parandada, mis on vale, ja isegi laiendada seda suurema sisuga. Aplaus kogu selle info jaoks !!!!