Bash Scripting: Vodnik za ustvarjanje

Bash skriptne skripte uporabljajo skrbniki sistema, programerji, omrežni inženirji, akademiki in praktično vsi, ki redno uporabljajo Linux /Unix. Ne glede na to, kaj uporabnik počne in kakšno je njegovo splošno obvladovanje računalniških veščin, lahko najde pravi način za uporabo Bash skriptov. Čeprav so pravilno, se imenujejo shell-skripte, vendar se večina programerjev sklicuje na svoje Bash skripte. Kot interaktivna lupina je kratek jezik za začetek in upravljanje izračunov. Kot skriptni jezik je to jezik, specifičen za domeno, za upravljanje in urejanje procesov in datotek.

Opredelitev Bash skripta

Bash skriptiranje - tolmač za ukazni jezik. Na voljo je v različnih operacijskih sistemih in je privzeti razčlenjevalnik ukazov za večino sistemov GNU /Linux. To je kratica "Bourne Again SHell".


Druge opredelitve:
  • Shell je makroprocesor, ki vam omogoča izvajanje interaktivnega ali neinteraktivnega ukaza.
  • Skriptiranje vam omogoča, da konfigurirate samodejno izvajanje ukazov, ki bi drugače delovali interaktivno ena za drugo.
  • Bash skriptiranje je privzeto na mnogih sistemih GNU /Linux, zato skript lupine deluje tudi, če ga ne opredeli kot tolmača. Če želite izvedeti, kaj se izvaja privzeti ukaz, vnesite: $ echo $ SHELL /bin /bash. Obstajajo še druge interpretacije lupine, kot so Korn, C in mnogi drugi. Zato je priporočljivo določitiinterpretator lupine, ki bo uporabljen posebej za vsebino skripta.


    Zdaj bodo vsi skripti vključevali definicijo interpretatorja lupine: #! /Bin /bash. Natančneje, to je zapisano v posebnem priročniku Advanced Bash scripting guide.

    Imena datotek in dovoljenja

    Če želite izvesti ukazno lupino, mora biti datoteka izvedljiva, izvršena z ukazom "chmod + x FILENAME". Privzeto se vse na novo ustvarjene datoteke ne izvedejo ne glede na pripono pripone datoteke. Dejansko najnovejša funkcija v sistemih GNU /Linux v bistvu ni nobenega pomena. Ko izvajate ukaz "ls" za navajanje vseh datotek in imenikov, je takoj jasno, da je .sh datoteka verjeten skript lupine, ".jpg" pa bo stisnjena slika. Za več informacij o datotečnih priponah v tem jeziku si oglejte priročnik za napredno pisanje Bash. V datotekah GNU /Linux lahko ukaz uporabite za identifikacijo vrste datoteke. Kot je razvidno iz spodnjega primera, razširitev datoteke nima pomena in tolmač lupine je v tem primeru bolj pomemben.
    Tako ime navideznega skripta "0_xyz" deluje dobro, čeprav se ga programerji skušajo čim bolj izogniti.

    Ukaz lupine PATH

    Ko razvijalec vnese ukaz v lupini, Bash pogleda določene imenike, da bi ugotovil, ali jih lahko najde. Torej, v skladu z Bash skriptnim vodnikom, če v lupini vnesete "ls", bo izvršil samo ukaz, če je na svoji poti. Operacija se konča z napako, če jene bo v enem od imenikov, ki so del poti. Če na poti najdete naključje v več kot enem imeniku, izbere prvo. Pot lahko najdete tako, da zaženete:
    echo $ PATH. Na zaslonu boste videli nekaj takega: /home /jzb /bin: /usr /local /bin: /usr /bin: /bin: /usr /bin /x11: /usr /X11R6 /bin: /usr /igre: /usr /lib /jvm /jre /bin.

    Pravilna pot do domačega imenika

    Vsak imenik, v katerem izgleda Bash, je ločen z dvopičjem. V tem primeru bo prvi pregledal imenik "bin" in nato /usr /local /bin, /usr /bin. Če se je uporabnik prijavil kot root, bi moral videti še en niz imenikov, vključno z /usr /local /sbin, /usr /sbin. Lahko jih dodate v gibanje ali uredite tako, da uredite datoteke: ~ /.bashrc in ~ /.bash_profile. Na primer: PATH = "$ HOME /bin: $ PATH". To pravilo lahko nekoliko spremenite in namestite napredno skripto Bash. PATH "=" pove Bashu, da bo nastavil pot, in "$ HOME /bin" ga povabi, da doda imenik bin, in po "$ PATH" priporoča, da doda vse, kar je že na poti. Parameter «:» je ločilo med elementi. Razvijalec bo videl nekaj podobnega temu na zaslonu svojega monitorja: če [-d "$ HOME /bin"]; potem PATH = "$ HOME /bin: $ PATH" fi. To pravilo bo preverilo, ali je imenik "bin" v domačem imeniku, in ga nato dodal na pot, da bi pravilno nadaljeval "operacijo Bash skripta".

    Vzdevek vrstice

    Alias ​​je niz, v katerem bo Bash zamenjal druga ekipa. Preprost primer: alias ls = 'ls --color = auto'. To mu pove, da morate pri zagonu "ls" zagnati "ls --color = auto", brez niza vsega drugega. V ukazni vrstici lahko nastavite vzdevke, kar je dobro za testiranje.
    To je smiselnonastavite vzdevke na "~ /.bash_profile in ~ /.bashrc". Ali pa ustvarite nekaj podobnega "~ /.aliases" in ga pokličite iz konfiguracijskih datotek na naslednji način: if [-f ~ /.bash_aliases]; potem ~ /.bash_aliases fi Če želite videti že obstoječe vzdevke, ga zaženite v ukazni lupini. To je privzeto označeno v distribuciji. Privzeta nastavitev je na primer openSUSE 11.2 brez sprememb.
    Kot test lahko vidite, da je že nameščen v distribuciji in poskusi narediti več svojih lastnih možnosti.

    Razširitev lupine

    Preden Bash izvede ukaz, oceni vnos in "razširja" vzdevke in druge izraze, kadar je to potrebno. Ima več znakov, ki jih nujno razširi, da se ujemajo z enim ali več znaki, in se imenujejo "simbol generalizacije". Takšna primerjava modelov je lahko zelo koristna. Če želite na primer videti vse JPEG datoteke v imeniku, zaženite "ls * jpg", pod pogojem, da so datoteke JPEG označene kot "jpg", in Bash ga bo razširil tako, da bo ustrezal vsem imenom datoteke, ki se konča z jpg.

    Če morate združiti samo en znak, uporabite "?". To bo kazalo na en sam znak, tako da? .Jpg "se bo ujemalo samo z imeni datotek, kot so" 1.jpg "ali" a.jpg ", ne" 01.jpg ". Bash vam omogoča tudi ujemanje obsegov znakov z uporabo oklepajev. Uporaba [abc12] se bo ujemala z enim od znakov v razširitvi. Torej bo delo z "ls -lh [abc12] .jpg" povezano z a.jpg, b.jpg, c.jpg, 1.jpg in 2.jpg, vendar ne z 12.jpg ali abc.jpg. Predloga lahko null določite s predpono "bang" (!), Na primer: ls -lh [! Ab12] .jpgse bo ujemala c.jpg ali 3.jpg, vendar ne 2.jpg, itd. Še en primeren trik je podaljšanje oklepaja, ko gre za organiziranje dokumentov po letih in datumih. Če ima na primer imenik ~ /Documents katalog 2010 z podimenikoma od 01 do 12 in ga ni treba tiskati od 01 do 12, namesto tega naredite Bash: mkdir 2010 /{0112}. Ko prebere pravilo, razširi vse, kar je v oklepajih, od 01 do 12. Deluje tudi s črkami, tako da če potrebujete poddirektorije preko z, lahko zaženete mkdir {az} in bo ustvaril imenike preko z. Lahko deluje tudi z velikimi črkami.

    Izvajanje skript

    Obstaja alternativni način za izvajanje skriptov Bash. V zelo enostavni predstavitvi njegov scenarij ni nič drugega kot besedilna datoteka, ki vsebuje navodila, ki jih je treba izvesti zaporedoma od zgoraj navzdol. Kako se navodila razlagajo, je odvisno od posameznega shebang-a ali načina izvajanja skripta.
    Druga metoda za izvajanje skriptov je izrecno klicati njen tolmač, na primer $ bash date.sh. Skript se bo zato izvajal brez potrebe po zagonu ukazne lupine in brez napovedi shebang, neposredno v shemi operacijskega sistema, s klicanjem izvršljive binarne datoteke bash. Tako bo vsebina datoteke date.sh naložena in interpretirana kot Bash Shell Script.

    Relativna in absolutna pot

    Preden lahko programirate uradni skript lupine, kot je izhodni skript Bash, morate z njim določiti navigacijo in nastaviti razliko med relativno in absolutno potjo do datoteke. Verjetno je najboljša analogija, ki pojasnjuje relativno in absolutno pot do datotekevizualizirajte datotečni sistem GNU /Linux kot večstransko zgradbo. Korenski imenik je vhodna vrata stavbe, označen s položajem, zagotavlja vhod v celoten datotečni sistem "strukture", zato omogoča dostop do vseh imenikov - "nadstropij" in "prostorov" - in datotek - "prebivalcem". Na primer, da bi šli v sobo 1 v 3. nadstropju, najprej vstopite v glavna vrata, nato pa pojdite v 3. nadstropje (raven 3) in vstopite v sobo (soba1). Torej, absolutna pot do te konkretne sobe na tleh znotraj stavbe "/level3 /room1". Torej, če želite obiskati sobo2 tudi na ravni 3, najprej poiščite trenutno lokacijo, ki je soba 1, tako da vnesete, "/", in nato z vključitvijo imena sobe "soba2". S tem sledi relativna pot do sobe 2, ki je v tem primeru "/room2". Ker je v tem primeru uporabnik že bil v tretji stopnji, mu ni treba zapustiti celotne stavbe in ponovno prečkati absolutne poti skozi glavni vhod /raven3 /soba2. Na srečo ima GNU /Linux preprosto orodje za kompas, ki pomaga programerju premikati po datotečnem sistemu kot ukaz "pwd". Ta ukaz vedno natisne trenutno lokacijo, ko se izvede. Naslednji primer bo uporabil ukaze "cd" in "pwd" za krmarjenje po datotečnem sistemu GNU /Linux z uporabo absolutnih in relativnih poti.
    Nadaljnje nadaljevanje.
    Izvedite ukaz "cd" brez argumentov za takojšnjo navigacijo do domačega imenika uporabnika od koder koli. Kot lahko vidite, je navigacija po datotečnem sistemu GNU /Linux preprosta in hkrati zelo zmedenatemo

    Koncepti spremenljivk

    Skoraj vsak programski jezik ima pojem spremenljivk - simbolično ime za del spomina, ki se mu lahko dodeljujejo vrednosti, berejo in manipulirajo z njegovo vsebino. Na primer, za primer skripta Bash, Hello World lahko naredite z uporabo spremenljivk. Upoštevajte, da okoli znaka "=" ne sme biti presledkov:
  • VAR = vrednost deluje;
  • VAR = vrednost ne deluje.
  • V prvem primeru ukazna lupina vidi simbol "=" in ukaz obravnava kot dodelitev spremenljivke. V drugem primeru lupina predpostavlja, da mora biti VAR ime ukaza in ga poskuša izvesti. Vnesite naslednjo kodo v var.sh.
    Ta spremenljivka MY_MESSAGE dodeli spremenljivko "Hello World". To zahteva narekovaje okoli niza Hello World, spremenljivka pa lahko vsebuje samo 1 vrednost, zato mora biti vrstica s presledki prikazana tako, da lupina ve, da se vse obravnava kot eno. V nasprotnem primeru bo ukazna lupina po dodelitvi »MY_MESSAGE = Hello« poskusila izvesti ukaz »Svet«. Lupina ni zahtevna glede na tipe spremenljivk, lahko shranijo nize, cela števila, veljavne številke - vse, kar je uporabniku všeč. Izkušeni programerji posvečajo pozornost dejstvu, da morajo biti posebni znaki ustrezno zaščiteni. To naredimo z ukazom shell-builtin, read, ki bere niz iz standardnega vhoda v dobavljeno spremenljivko. Če mu podate polno ime in ne uporabite dvojnih narekovajev ukaza "echo", je še vedno pravilno prikazan. Večina jezikov ima koncept zank, če morate opravilo ponoviti dvajsetkrat, je malo verjetno, da bo uporabnik želel vnesti kodo 20-krat, in verjetno,z napakami Za to so v "Bournejevi lupini" zanke "za" in "medtem". To daje nekoliko manj možnosti kot drugi jeziki, vendar nihče ne trdi, da ima programiranje lupine silo C. Za-zanko se ponavlja skozi niz vrednosti, dokler seznam ni izčrpan, vrednosti ghb 'njv so lahko poljubne.

    Prvi scenarij

    Za prvi skript lupine lahko preprosto napišete skript, ki pravi "Hello World." Ustvarite datoteko (first.sh) na naslednji način: first.sh Prva vrstica pove Unixu, da mora biti datoteka zagnana /bin /sh. To je standardna postavitev lupine za skoraj vsak sistem Unix. Če uporabljate Linux Bash skript, je GNU /Linux /bin /sh ponavadi simbolna referenca na bash ali pa je pomišljaj pravkar postal pogostejši. Druga vrstica se začne s posebnim znakom "#". Označuje črto kot komentar, lupina jo popolnoma ignorira. Edina izjema je, ko se začne prva vrstica datoteke "#!". To je posebna direktiva, ki jo Unix obravnava posebej in pomeni, da tudi če uporabljamo "csh", "ksh" ali kaj drugega kot interaktivno lupino, jo nato razlaga Bourne. Podobno se Perl lahko začne z nizom: #! /Usr /bin /perl To bo interaktivni ukazni lupini povedalo, da mora biti naslednji ukaz izvršen perl. Za programiranje Bourneove lupine se običajno uporabljajo: #! /Bin /sh. Tretja vrstica izvede ukaz "echo" z dvema parametroma ali argumentoma: prvi je "Hello"; Drugi je "Svet". Bodite pozorni, da bo "echo" samodejno nastavil en prostor med svojimi parametri. Simbol še vedno beleži # komentar in vselupina zanemari naslednje.

    Preskus testnega scenarija

    ​​Test se uporablja za skoraj vsak pisni skript lupine. V tem primeru se "test" ne imenuje tako neposredno, pogosteje, uporabite zapis "[". Gre za simbolno povezavo te besede, ki omogoča, da so lupinski programi bolj berljivi, kar običajno pomeni, da bo lupina skripta lupine Bash sama interpretirana kot "[" kot vrednost testa, tudi če je Unix okolje različno konfigurirano. To pomeni, da je "[" v resnici program, kot so "ls" in drugi, zato ga je treba obdati s presledki: če [$ foo = "bar"] ne bo deloval, ker se interpretira kot: if test $ foo = "bar"], ki je "]" brez začetka "[". V tem primeru postavite prostore okoli vseh operaterjev in izberite obvezen prostor "SPACE", ki ga zamenjate z dejanskim prostorom, sicer, če ni prostora, ne bo delovalo: če SPACE [SPACE] $ foo "SPACE = SPACE" bar SPACE] Nekatere lupine sprejmejo "==" za primerjavo nizov. Za slednje je najbolje uporabiti enojni "" ali "-eq" za cela števila. Kot lahko vidite, je test preprost, a zmogljiv pripomoček za primerjavo, ki je potreben za delovanje lupine. Seveda, vsi ne bodo postali guruji na koncu branja članka, temveč bodo bolj samozavestni in oboroženi s potrebnim znanjem in veščinami, da z lahkoto opravljajo svoje delo.

    Sorodne publikacije