0. Indeks
- Asjad, mis juhtuvad enamiku inimestega
- Skripti ülesehitus
- Ekraanile printimine
- Loe kasutaja INPUT
- Arvutused bash
- Tingimused
- Silmused
- funciones
- 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
BIN = "kaust, kus meil on skriptid" PATH = "$ BIN $ PATH"
2. Skripti ülesehitus
- Peakoda
- Globaalsete muutujate määratlus
- Aitama
- funciones
- 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.
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.
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"
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))
6 Tingimused
Sellest on juba väga ulatuslikult kirjutatud «if","teine","elif»Ja tingimused. Selle kohta saate lugeda:
- Programmeerimine Bashis: 1. osa
- Bash: kui siis muud tingimused on
- Kontrollige, kas fail või kaust on olemas, või mitte, if-silmusega
- Programmeerimine Bashis: 2. osa
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
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.
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.
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).
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.
Meisterlikult. Ma ei ütle rohkem U_U
Tere, väga hea artikkel.
Tere, et paned õigused sudo + x asemel chmod + x
$ sudo chmod + x script.sh
(Täpsemalt öeldes, hehe)
Ah, palju õnne ja aitäh!
Väga hea postitus, ma tõesti õnnitlen teid, hoidke seda, Tervitused
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
TÜPIKOOS. Suurepärane ja väga hästi selgitatud.
Gracias.
Suurepärane postitus sellel teemal 😉
Väga huvitav ja väga oluline tänu teabe eest ...
CHEERS !!!
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.
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!
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 😀).
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
Väga hea bashi skripti õpetus!
-- 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)}' ».
Umbes "kodeerimine»Seda blogi on varem mainitud:
Bash: kuidas skript käivitatavaks muuta
Installimisjärgse utiliidi skript
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.
Suurepärane õpetus, kuna Sysadmin oskab Bashis skriptimist, on see kasulik kõigeks.
Väga väga hea!
Tervitused!
Kui see on kellelegi kasulik, on siin oma skriptide loomiseks mitu kasutamist ja näidet: https://github.com/reduardo7/hsabx
Väga hea. Uusi asju, mida minu skriptidesse lisada. Kodeerimises ja printf-asjas seda polnud.
Aitäh!!!
Niiii hea artikkel! Hoian seda lemmikute jaoks, oleks tore parandada, mis on vale, ja isegi laiendada seda suurema sisuga. Aplaus kogu selle info jaoks !!!!