0. Kazalo
- Stvari, ki se zgodijo večini ljudi
- Struktura scenarija
- Tiskanje na zaslon
- Preberite uporabnika INPUT
- Izračuni v bash
- Pogoji
- Zanke
- Funciones
- 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
BIN = "mapa, v kateri imamo skripte" PATH = "$ BIN $ PATH"
2. Struktura scenarija
- Headboard
- Opredelitev globalnih spremenljivk
- Pomaga
- Funciones
- 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.
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.
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"
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))
6. Pogoji
Že zelo obširno je pisalo o «if«,«ostalo«,«elif»In pogoji. O tem si lahko preberete v:
- Programiranje v Bashu: 1. del
- Bash: če, potem pa drugače
- Z zanko if preverite, ali datoteka ali mapa obstaja ali ne in še več
- Programiranje v Bashu: 2. del
Ž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
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.
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.
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).
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.
VELIKO. Ne rečem več U_U
Pozdravljeni, zelo dober članek.
Hej, dal si dovoljenja sudo + x namesto chmod + x
$ sudo chmod + x script.sh
(Natančneje, hehe)
Ah, čestitke in hvala!
Zelo dobra objava, resnično vam čestitam, nadaljujte tako, Lep pozdrav
Č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
KOMAD tutorstva. Odlično in zelo dobro razloženo.
Hvala.
Odlična objava na to temo 😉
Zelo zanimivo in pomembno, hvala za informacije….
NA ZDRAVJE !!!
Hvala vsem za čestitke, saj za ukaz Miguel ne dovoli, da spremenim vnos, ko bo objavljen. Predstavljati bo treba, kot si predstavljam.
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!
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 😀).
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
Zelo dobra vadnica za bash skripte!
-- 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)}' ».
O «kodiranje»V tem blogu je bilo omenjeno že prej:
Bash: kako narediti skript izvršljiv
Skript pomožnega programa za namestitev
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.
Odlična vadnica, saj je Sysadmin, ki pozna skriptiranje v Bashu, bistvenega pomena in je koristen za vse.
Zelo zelo dobro!
Lep pozdrav!
Če je komu koristen, je tukaj nekaj načinov uporabe in primerov za ustvarjanje lastnih skriptov: https://github.com/reduardo7/hsabx
Zelo dobro. Nove stvari, ki jih moram dodati v moje skripte. Stvar encodig in printf je nista imela.
Hvala vam!!!
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 !!!!