Index
0. Indeks
- Dinge wat met die meeste mense gebeur
- Struktuur van 'n skrif
- Druk op die skerm
- Lees gebruiker INPUT
- Berekeninge in bash
- Voorwaardes
- Loops
- funksies
- getops
1. Dinge wat met die meeste mense gebeur
/ bin / bash of / bin / sh
Een van die eerste dinge wat die masjien doen tydens die uitvoering van ons script, is om te kyk met watter dop dit moet doen. Op die meeste huidige Linux-stelsels / Bin / sh is 'n skakel na / bin / bash, maar dit is nie altyd die geval nie, byvoorbeeld in verspreidings wat gebruik word besigbox hulle bring Sh en gewoonlik bring hulle ook Bash, maar as u gebruik / Bin / sh, dit sal nie saam met Bash werk nie. Daarom beveel ek aan om altyd te gebruik / bin / bash.
Unicode teen ASCII
Het u al ooit gewonder waarom u nie "¿" of "ñ" in u skrifte kan gebruik nie? Of gebruik aksent? Dit kan nogal irriterend wees in interaktiewe skrifte. Dit is omdat die standaardkodering van Bash ASCII is, of wat dieselfde is, die Engelse karakterset. Om dit te verander, hoef ons net vir ons script te sê dat ons Unicode wil gebruik. Daarvoor moet u 'n reël byvoeg net na die tolk van die opdrag:
# - * - KODERING: UTF-8 - * -
Wees versigtig, dit is belangrik dat hierdie reël aan die begin van die skrif verskyn.
Maak die skrif uitvoerbaar
Dit is snaaks met hoeveel mense die tekste bestuur met «$ bashscript.sh" in plaas van "$ ./script.sh'Dit is immers waarvoor ons 'n dop gedefinieer het.
Om uitvoeringstoestemmings by te voeg, moet u dit uitvoer:
sudo + x script.sh
BIN = "map waar ons die skrifte het" PATH = "$ BIN $ PATH"
2. Struktuur van 'n skrif
- Hoofstuk
- Definisie van globale veranderlikes
- Help
- funksies
- Hoof liggaam
Die kop is waar ons aandui watter dop ons wil gebruik en die kodering. Die voordeel van die funksies is om kode wat herhaal word te hergebruik deur dit net een keer te skryf en om dit makliker te verstaan om die skrif te verstaan. Vir kode wat meer as 100 reëls is, is dit baie handig.
Om funksies te kan gebruik, moet dit gedefinieer word voor die hoofstuk van ons skrif. En as ons veranderlikes op die globale vlak van al ons skrif wil gebruik, sowel in die hoofdeel as in die funksies, moet ons dit aan die begin van alles definieer, net na die kop.
Laastens is dit 'n goeie praktyk om 'n helperfunksie te skryf vir die feit dat ons script sleg of sleg is. Dit is duidelik dat ons in daardie gevalle onmiddellik die script wil verlaat sonder om die funksies te lees. Daarvoor kan ons gebruik:
funksiehulp () {echo "" "Ons goed geformateerde hulpteks." "" verlaat as [[-z $ 1 || $ 1 == "-h" || $ 1 == "--hulp"]]; help dan fi
As ons 'exit' by die hulpfunksie voeg, sal ons die script verlaat elke keer as ons help, byvoorbeeld na foutboodskappe, ens. Ons stoor 'n paar reëls kode.
Die voorwaarde dui op vertoonhulp op die skerm aan en verlaat as die script sonder parameters uitgevoer word of as -h / –help gespesifiseer word. As u daarna kyk, is dit die standaardgedrag van die meeste Linux-programme.
3. Druk op die skerm uit
Daar is twee hoofopdragte om in bash na die skerm te druk: «mis»Y«printf«. Hulle is albei net so vinnig en albei is deel van bash. Die belangrikste verskil vir 'n beginner is dat eggo 'n nuwe reël aan die einde toevoeg, terwyl «printf"Doen nie.
Echo is baie goed en dit is wat die meeste mense gebruik, maar wanneer hulle die INPUT van die gebruiker lees, of as u veranderlikes wat uit lêers geneem is deur middel van woordverwerking, wil druk, kan vreemde dinge gebeur. Dit word gewoonlik maklik opgelos, net so maklik soos om die dubbele aanhalings te verander na enkelvoudig of andersom, of om die veranderlike verwysings uit die aanhalings te haal. «Echo»Doen vreemde dinge ook, afhangende van hoe dit saamgestel is, as ons altyd Ubuntu of altyd Fedora gebruik, dan raak dit ons nie, maar as ons die verspreiding verander, doen dit wel.
Daarom gebruik ek «printf«, Wat my nie hoofpyn gee nie en my ook meer soos 'printf»Van C of die«druk»Van Python is dit baie belangrik as u ooit u script na 'n ander programmeertaal wil oordra.
4. Lees gebruiker INSET
Alles wat ons na die naam van ons skrif skryf en voordat ons op die ENTER-sleutel druk, word outomaties in spesiale veranderlikes gestoor. Hierdie veranderlikes is van die tipe $ X waar X 'n getal is.
«$0»Dui die naam van ons skrif aan en van«$1»Tot oneindigheid is alles wat ons later geskryf het, veranderlik. Byvoorbeeld:
kat << EOF >> test.sh #! / bin / bash # - * - KODERING: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n "EOF chmod + x script.sh ./script.sh my file.txt
Ons skep 'n toetsskrif, maak dit uitvoerbaar en voer dit uit met twee parameters. Ons verkry die skermuitset van:
$ 0 = ./script.sh $ 1 = my $ 2 = file.txt
Met aanhalings kon ons 'my file.txt' na '$ 1' deurgegee het.
Ons kan ook die INGANG van 'n gebruiker lees met die "lees" -opdrag, wat die veranderlike direk aandui waar ons die parameter wil stoor. Byvoorbeeld:
printf "Wat is jou naam? \ n" lees NAME printf "Hallo, $ NAME. \ n"
5. Berekeninge in Bash
Daarvoor kan ons gebruik maak van «Expr«, Solank ons nie ingewikkelde berekeninge hoef te doen nie. Daar moet op twee dinge gelet word, die eerste is dat «Expr»Laat slegs heelgetalle toe, die tweede is dat die afdeling die hele resultaat oplewer, om die res te sien wat ons kan gebruik«%«.
Gewoonlik wil ons die resultaat van expr aan 'n veranderlike toewys. Ons kan dit op twee maniere doen:
VAR2 = `expr $ VAR1 / 10` VAR2 = $ (expr $ VAR1 / 100)
U kan ook slaan oor «Expr»Gebruik dubbele hakies:
VAR2 = $ (($ VAR1 / 100))
6. terme
Dit is reeds op 'n baie uitgebreide manier geskryf oor «if","anders","elif»En voorwaardes. U kan daaroor lees in:
- Programmering in Bash: deel 1
- Bash: as, dan, anders voorwaardes
- Gaan na of daar 'n lêer of 'n map bestaan en meer met 'n if-lus
- Programmering in Bash: deel 2
Ek wil net die verskil tussen die gebruik van eenvoudige vierkantige hakies uitlig, «[]«, En dubbele hakies,«[[]]«, Vir die voorwaardes. Met dubbele hakies kan ons addisionele voorwaardes gebruik:
- «&&»Vir en
- «||»Vir of
Om "&&»Y«||»Met eenvoudige vierkantige hakies moet elke onderdeel tussen verskillende hakies geskei word. Die voorbeeld wat gebruik word vir die deel van die script wat kyk of hulp nodig is, is:
as [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--hulp"]]; help dan fi
Dit spaar ons ook om die veranderlike name in aanhalingstekens te moet skryf om foute te voorkom. Byvoorbeeld:
as [$ 1 = 1]; dan printf "Die parameter is gelyk aan 1."; fi if ["$ 1" = 1]; dan printf "Die parameter is gelyk aan 1."; fi as [[$ 1 = 1]]; dan printf "Die parameter is gelyk aan 1."; fi
As script.sh uitgevoer word sonder enige parameters, sou die eerste geval 'n fout gee:
bash: [: =: eenmalige operateur verwag
Waaroor nie gepraat is nie, is «geval«, Word vereenvoudig«if«. Kom ons begin by die begin, as ons nie meer het nie «if»Al die kode word uitgevoer. As ons 'n voorwaarde byvoeg «if»Ons sal twee gevalle hê, een waarin die kodeblok binne-in die«if»En die ander geval waar hierdie blok nie uitgevoer word nie.
As ons 'n «andersOns sal ook twee sake hê, maar hierdie twee sake verskil van die vorige sake. Want nou is daar twee voorwaardelike kodeblokke, A en B, en 'n C-blok, wat die res van die program is. A of B sal uitgevoer word, en C. In die vorige geval was dit A en C of slegs C.
Om skryfvoorwaardes te vermy «as / anders"binne"anders»En om die lees van die kode te vereenvoudig, is dit geskep«elif«. As ons baie toestande het wat van die vorige afhang, byvoorbeeld die getalreeks of die tipe:
VAR1 = $ 1 as [[$ VAR1 = 1]]; druk dan "1 \ n" elif [[$ VAR1 = 2]]; druk dan "2 \ n" elif [[$ VAR1 = 3]]; dan printf "3 \ n" anders printf "geen \ n" fi
In die geval van die laaste «elif»Baie voorwaardes sal gelees word. In die geval word hierdie proses vaartbelyn:
VAR1 = $ 1 geval $ VAR in 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 of 4, dit hang af \ n" ;; *) printf "geen \ n" ;; dat C
'N Veranderlike sal gelees word, in hierdie geval VAR1, en dit sal nagegaan word of dit gelykstaande is aan enige van die gevalle, indien nie, sal die verstekgeval' * 'uitgevoer word. Dubbele puntkomma's is gelykstaande aan «breek«, Hulle vertel«geval»Dit moet eindig.
7. Lusse
Baie min lusse is in enige programmeertaal bekend. In Bash is hulle «terwyl","totdat»Y«vir«. Hieroor is al in die blog geskryf:
Daar is twee soorte lusse «vir«, Diegene wat van die tipe is«$ vir VAR in LOQUESEA»En wat is van tipe C«$ vir ((I = 0; I <= 10; I ++))«. Die tweede tipe lusse «vir»Is baie nuttig, dit het drie dele aan die begin van die lus:
- Verklaring en inleiding van veranderlikes (in hierdie geval 'n hulpveranderlike "I = 0").
- Uitvoeringstoestand (totdat ek minder as of gelyk is aan 10).
- Toename in die hulpveranderlike
Na my mening is dit die kragtigste lus van almal. 'N Voorbeeld wat alle getalle van 0 tot 10 afdruk, insluitend:
#! / bin / bash vir ((I = 0; I <= 10; I ++)); druk "$ I \ n" gedoen
8. Funksies
Daar is 'n paar dinge wat Bash ons nie toelaat om te doen nie, of hoe? Met die eerste oogopslag verhoed bash-funksies u om 3 dinge te doen: plaaslike veranderlikes in funksies verklaar, parameters aan funksies oordra en parameters terugstuur. Alles het 'n oplossing.
Moet niks doen soos:
#! / bin / bash VAR = 1 printc "$ VAR \ n" funksie hallo () {VAR = 2 printf "$ VAR \ n"} hallo printf "$ VAR \ n"
Dit word op skerm 1, 2 en 2 afgedruk.
Voeg plaaslike veranderlikes by, voeg «plaaslike»Wanneer u verklaar:
#! / bin / bash VAR = 1 printf "$ VAR1 \ n" funksie foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"
Dit druk 1, 1, 2, 1 op die skerm af.
Hoe gee u parameters oor aan 'n funksie?
#! / bin / bash # - * - KODERING: UTF-8 - * - funksie hallo () {printf "Hallo $ 1 \ n"}
printf "Wat is jou naam? \ n"
lees VAR1
hallo $ VAR1
Hoe word parameters teruggestuur?
#! / bin / bash # - * - KODERING: UTF-8 - * - funksie hallo () {printf "Hallo holita"} printf "Wat is u naam? \ n" lees VAR1 VAR1 = $ (hallo) # HIER IS DIT printf "$ VAR1 $ VAR2 \ n"
Soos u kan sien, het dit twee nadele, u kan slegs een parameter teruggee, wat 'n vektor kan wees 😀, en as u 'n parameter wil terugstuur, kan u nie meer vanaf die funksie op die skerm druk nie.
9. Getops
Een van die laaste dinge wat u moet weet oor Bash om komplekse skrifte te skep, is «getops«. Dit word gebruik om opsies na die script oor te dra ongeag die volgorde. Die enigste nadeel is dat dit slegs kort opsies beïnvloed:
#! / bin / bash # - * - KODERING: UTF-8 - * - VARC = 0 funksiehulp () {printf "Hulpboodskap \ n" afrit} as [[-z $ 1]]; help dan fi terwyl getopts: ha: b: c OPT; doen $ $ OPT in h) help ;; :) hulp ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) hulp ;; esac klaar # Hoofblok van die script wat # doen met VARA, VARB en VARC
«opneem»Lees die opsies een vir een, dus is 'n lus nodig.
Daar is twee tipes opsies wat geslaag kan word met behulp van «kry op":
- Parameters genoem vlae, in hierdie geval -c of -h. Dit word gespesifiseer met die letter wat ons wil gebruik. Dit is soos Boole-veranderlikes, «waar»(Are) of«valse'(Hulle is nie hier nie).
- Parameters met gepaardgaande argumente, -a enigiets, -b enigiets. Hulle word gespesifiseer met die letter wat ons wil hê met 'n dubbele punt hieronder. Die argument word in OPTARG gestoor (hierdie naam is onveranderlik).
Wat doen hierdie skrif?
Vertoon die hulpboodskap wanneer geen opsie oorgedra word nie, wanneer die parameter "-h" deurgegee word, as 'n ongeldige parameter deurgegee word (byvoorbeeld "-x", word dit gedoen deur "\?") Of wanneer 'n geldige parameter sonder argument (":"). In die res van die gevalle bespaar dit die teenwoordigheid van '-c' as 'n 1 in VARC, en die waardes wat met '-a' en '-b' in VARA en VARB oorgedra word.
20 kommentaar, los joune
MEESTERLIK. Ek sê nie meer U_U nie
Hallo baie goeie artikel.
Haai, jy moet toestemming gee sudo + x in plaas van chmod + x
$ sudo chmod + x script.sh
(Om presies te wees, hehe)
Ag, baie geluk en dankie!
Baie goeie boodskap, die waarheid is ek wens u geluk, hou so aan, Groete
En as u wil hê dat die script sigbaar moet wees wanneer dit uitgevoer word, stap vir stap, om te sien hoe veranderlikes, voorwaardes en alles optree, kan u gebruik:
sh -x skrif
Groete
STUK van toesig. Uitstekend en baie goed verduidelik.
Dankie.
Uitstekende boodskap oor die onderwerp 😉
Baie interessant en belangrik, dankie vir die inligting ...
CHEERS !!!
Baie dankie vir u gelukwense, net vir die Miguel-opdrag, hy laat my nie die inskrywing verander sodra dit gepubliseer is nie. Ek sal dink dat dit elav moet doen.
Baie goed!
In die eerste plek wou ek u gelukwens met die pos, ek het dit maklik verstaanbaar en dit help regtig om die riglyne te volg om goed te baseer, veral vir mense wat begin programmeer.
Ek het egter 'n paar besonderhede gevind wat volgens my reggestel moet word.
Eerstens: in afdeling «2. STRUKTUUR VAN 'N SKRIF »die funksie is nie gesluit nie, wat probleme sal veroorsaak wanneer dit in 'n script uitgevoer word.
Die oplossing sou wees om 'n sluiting daaraan toe te voeg net na die "exit" -opdrag.
Tweedens: in afdeling «4. LEES DIE GEBRUIKERSINSETTING »u bevestig dat die parameters wat die gebruiker kan invoer wissel van $ 0 tot oneindig, maar" bash "sal slegs tussen $ 0 en $ 9 interpreteer, aangesien $ 10 gelyk sal wees aan $ 1 + 0.
Om hierdie probleem op te los, kan u die opdrag "shift" gebruik om die volgende veranderlikes te gryp. Of spesifiseer die veranderlike tussen hakies "$ {10}", sodat bash die waardes saamvat, nie as $ 1 + 0 nie.
Sonder verdere gedoente, groete!
Dankie vir u kommentaar. Die korrekte gebruik van exit, sowel in die script as in die funksies, het heeltemal misluk. Wat $ {10} betref, het ek nog nooit soveel bemaak nie, dus het ek nie die probleem raakgeloop nie, dit is goed om te weet dat daar 'n oplossing daarvoor is (ek het die nuwe ding wat vandag geleer is, reeds deurgetrek 😀).
Baie dankie vir die artikel! Sommige dinge wat u noem, het nog nie duidelikheid gehad nie. Byvoorbeeld, getops.
In die deel van die skermuitsette moes u die kat noem wat u later noem ...
kat <
***************************************
* HIERDIE VORM IS BAIE UITDRUKKEND *
***************************************
EOF
In u voorbeeld:
kat << EOF >> test.sh
Daar is twee dinge om te noem ... >> dit is 'voeg' aan, dit is, as u dieselfde opdrag herhaal, sal u die hele skrif in duplikaat hê ... U moet net een gebruik ...
kat << EOF> script.sh
Ja, dit moet ook script.sh genoem word
Dan in
as [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–hulp"]]; dan
help
fi
Ek dink dit moet geskryf word ...
as [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–hulp"]]; dan
...
Daar is baie meer om uit BASH te ontdek.
Kan jy dit 'BASIES' noem? 🙂
Parameter 'testers' hou byvoorbeeld van -z om te sien of dit leeg is, of -f om te weet of dit as 'n lêer bestaan.
Nogmaals dankie vir u moeite.
alberto
'N Baie goeie bash script handleiding!
-- KODERING: UTF-8 --
Dit is die eerste keer dat ek die reël sien om karakterkodering in 'n bash-skrif in te stel. Dit lyk meer tipies van Python as Bash. Is dit regtig nodig? Ek het na 'n verwysing op Google gesoek, maar ek kan niks vind nie. Het u 'n skakel byderhand wat oor hierdie saak praat? Spesifiek oor die geskiktheid van die lyn.
Myns insiens hoef u slegs die tekslêer as sodanig te stoor (sonder BOM) en sekere omgewingsveranderlikes (LANG en LC_ *) korrek te stel om skrifte in Bash met UTF-8 te skryf.
Dan is dit uiteraard nodig dat die uitgevoer opdragte voorberei word vir ander kodering as ASCII. As ons byvoorbeeld na hoofletters wil gaan, lyk dit nie asof dit werk nie:
«Echo áéíóú | tr az AZ »
o:
«Echo áéíóú | tr [: onderste:] [: boonste:] »
en dit is beter om te gebruik:
«Echo áéíóú | awk '{print toupper ($ 0)}' ».
Oor die «encoding»Is al voorheen in hierdie blog genoem:
Bash: hoe om 'n script uitvoerbaar te maak
Plaas die installasietoolscript
Iemand korrigeer my, maar daardie koderingsreël (# -- KODERING: UTF-8 --) Dit het niks met bash of die dop te doen nie: dit is 'n opmerkingsreël (begin met #) en dien om die REDAKTEUR te vertel dat ons die kodering van die lêer gebruik om die script (vim, emacs ...) te skryf.
In werklikheid sien bash nie so 'n reël nie, want dit is 'n opmerkingsreël.
Uitstekende tutoriaal, aangesien Sysadmin die kennis van Scripting in Bash noodsaaklik is, is dit nuttig vir alles.
Baie, baie goed!
Groete!
In die geval dat dit nuttig is vir enigiemand, is daar 'n paar gebruike en voorbeelde om u eie skrifte te skep: https://github.com/reduardo7/hsabx
Baie goed. Nuwe dinge om by my skrifte te voeg. Die kodige ding en die printf-ding het dit nie gehad nie.
Dankie!!!
Sooo goeie artikel! Dit hou ek vir gunstelinge, dit sal lekker wees om reg te stel wat verkeerd is en dit selfs met meer inhoud uit te brei. 'N Applous vir al hierdie inligting !!!!