0. Kazalo
- Stvari koje se događaju većini ljudi
- Struktura skripte
- Ispis na ekranu
- Pročitajte ULAZ korisnika
- Izračuni u bash
- Uvjeti
- Petlje
- Funkcije
- Getopi
1. Stvari koje se događaju većini ljudi
/ bin / bash ili / bin / sh
Jedna od prvih stvari koje stroj radi prilikom izvršavanja naše skripte je gledanje s kojom školjkom bi to trebao učiniti. Na većini trenutnih linux sustava / Bin / sh je poveznica na / bin / bash, ali to nije uvijek slučaj, na primjer u distribucijama koje koriste zauzeto donijeti Sh a obično i donose Tresnuti, ali ako koristite / Bin / sh, neće se pokretati s Bashom. Zato preporučujem uvijek upotrebu / bin / bash.
Unicode u odnosu na ASCII
Jeste li se ikad zapitali zašto u svojim skriptama ne možete upotrijebiti "¿" ili "ñ"? Ili koristiti naglaske? To može biti prilično dosadno u interaktivnim skriptama. To je zato što je zadano kodiranje Basha ASCII, ili što je isto, engleski znak. Da bismo je promijenili, samo moramo reći našoj skripti da želimo koristiti Unicode. Za to morate dodati redak odmah nakon interpretatora naredbi:
# - * - KODIRANJE: UTF-8 - * -
Budite oprezni, važno je da je ovaj redak na početku skripte.
Neka skripta bude izvršna
Smiješno je koliko ljudi pokreće skripte s «$ bash skripta.sh" umjesto "$ ./script.sh'Napokon, za ovo smo definirali školjku.
Da biste dodali dozvole za izvršenje, morate izvršiti:
sudo + x skripta.sh
BIN = "mapa u kojoj imamo skripte" PATH = "$ BIN $ PATH"
2. Struktura skripte
- Uzglavlje
- Definicija globalnih varijabli
- Pomoći
- Funkcije
- Glavno tijelo
Zaglavlje je mjesto gdje naznačujemo koju ljusku želimo koristiti i kodiranje. Prednost funkcija je ponovna upotreba koda koji se ponavlja tako da se napiše samo jednom i kako bi se olakšalo razumijevanje skripte, jer je kod koji prelazi 100 redaka vrlo koristan.
Da bi se koristile funkcije, one moraju biti definirane s prije glavnog dijela naše skripte. A ako želimo koristiti varijable na globalnoj razini cijele naše skripte, i u glavnom dijelu i u funkcijama, moramo ih definirati na početku svega, odmah nakon zaglavlja.
Na kraju, dobra je praksa pisati pomoćnu funkciju kada naša skripta radi loše ili s lošim parametrima. Očito je da u tim slučajevima želimo odmah izaći iz skripte, bez čitanja funkcija. Za to možemo koristiti:
function help () {echo "" "Naš dobro oblikovan tekst pomoći." "" izlaz ako [[-z $ 1 || $ 1 == "-h" || $ 1 == "--pomoć"]]; onda pomozi fi
Ako dodamo "izlaz" u funkciju pomoći, izaći ćemo iz skripte svaki put kad pokrenemo pomoć, na primjer nakon poruka o pogreškama itd. Uštedjeli smo nekoliko redaka koda.
Uvjet označava prikaz pomoći na ekranu i izlaz ako se skripta izvodi bez parametara ili ako je naveden -h / –help. Ako pogledate, to je standardno ponašanje većine linux programa.
3. Ispis na ekranu
Postoje dvije glavne naredbe za ispis na zaslon u bashu: «odjek»Y«printf«. Oboje su jednako brzi i obojica su dio basha. Glavna razlika za početnike je ta što eho na kraju dodaje novu liniju, dok «printf"Ne.
Echo je u redu i ono je što većina ljudi koristi, međutim, prilikom čitanja korisnikova INPUT-a ili kada želite ispisati varijable preuzete iz datoteka obradom teksta, mogu se dogoditi neobične stvari. Obično se lako rješavaju, lako poput mijenjanja dvostrukih navodnika u jednostruke ili obrnuto ili uklanjanja referenci varijabli iz navodnika. «Odjek»Čini li neobične stvari i ovisno o tome kako je sastavljen, ako uvijek koristimo Ubuntu ili uvijek Fedoru, to ne utječe na nas, ali ako promijenimo distribuciju, to i učini.
Zbog toga koristim «printf«, Što me ne boli u glavi, a ponaša se više poput«printf»Iz C ili«otisak»Python, ovo je vrlo važno ako ikada želite prenijeti svoju skriptu na drugi programski jezik.
4. Pročitajte ULAZ korisnika
Sve što napišemo nakon naziva naše skripte i prije nego što pritisnemo tipku ENTER automatski se sprema u posebne varijable. Te su varijable tipa $ X gdje je X broj.
«$0»Označava naziv naše skripte i od«$1»Do beskonačnosti sve što smo kasnije napisali je promjenjivo. Na primjer:
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
Izrađujemo testnu skriptu, činimo je izvršnom i pokrećemo s 2 parametra. Dobivamo izlaz na ekranu:
$ 0 = ./script.sh $ 1 = moj $ 2 = file.txt
Koristeći navodnike mogli smo proslijediti "my file.txt" na "$ 1".
Također možemo pročitati ULAZ korisnika pomoću naredbe "read", izravno ukazujući na varijablu u kojoj želimo spremiti parametar. Na primjer:
printf "Kako se zoveš? \ n" pročitaj IME printf "Zdravo, $ NAME. \ n"
5. Izračuni u Bashu
Za to možemo koristiti «Expr«, Sve dok ne trebamo raditi složene izračune. Treba napomenuti dvije stvari, prva je da «Expr»Prihvaćaju samo cijele brojeve, drugo je da dijeljenje vraća cijeli rezultat, da vidimo ostalo što možemo koristiti«%”.
Obično ćemo želju rezultat izraza dodijeliti varijabli. To možemo učiniti na dva načina:
VAR2 = `izraz $ VAR1 / 10` VAR2 = $ (izraz $ VAR1 / 100)
Također možete preskočiti «Expr»Upotreba dvostrukih zagrada:
VAR2 = $ (($ VAR1 / 100))
6. uvjeti
Već je vrlo opširno napisano o «if„”drugo„”Elif»I uvjeti. O tome možete pročitati u:
- Programiranje u bashu: 1. dio
- Bash: ako, onda, postoje drugi uvjeti
- Provjerite postoji li datoteka ili mapa ili ne, a i više pomoću petlje if
- Programiranje u bashu: 2. dio
Želim samo naglasiti razliku između upotrebe jednostavnih uglatih zagrada, «[]«, I dvostruke zagrade,«[[]]«, Za uvjete. Dvostrukim zagradama možemo koristiti dodatne uvjete:
- «&&»Za i
- «||»Za ili
Koristiti "&&»Y«||»Jednostavnim uglastim zagradama svaki dio treba odvojiti u zasebne uglate zagrade. Primjer koji se koristi za dio skripte koji izgleda da li treba izvršiti pomoć bio bi:
ako [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- pomoć"]]; onda pomozi fi
Također nas štedi od potrebe za zapisivanjem imena varijabli u navodnike kako bismo spriječili pogreške. Na primjer:
ako je [$ 1 = 1]; zatim printf "Parametar je jednak 1."; fi ako ["$ 1" = 1]; zatim printf "Parametar je jednak 1."; fi ako [[$ 1 = 1]]; zatim printf "Parametar je jednak 1."; fi
Ako se script.sh izvodi bez ikakvih parametara, prvi će slučaj dati pogrešku:
bash: [: =: očekuje se unarni operator
Ono o čemu se nije razgovaralo je «slučaj«, Koristi se za pojednostavljenje«if«. Krenimo od početka, kad nemamo «if»Izvršit će se sav kôd. Ako dodamo uvjet «if»Imat ćemo dva slučaja, jedan u kojem blok koda koji se nalazi unutar«if»I drugi slučaj kada se ovaj blok ne izvršava.
Ako dodamo «drugo«Također ćemo imati dva slučaja, ali ova dva slučaja razlikuju se od prethodnih. Jer sada će postojati dva uvjetna bloka koda, A i B, i C blok, što je ostatak programa. Izvršit će se A ili B i C. U prethodnom slučaju to su bili A i C ili samo C.
Da bi se izbjegli uvjeti pisanja «ako / inače"unutar"drugo»A radi pojednostavljenja čitanja koda, stvoren je«Elif«. Kada imamo mnogo uvjeta koji ovise o prethodnom, na primjer raspon brojeva ili vrsta:
VAR1 = 1 USD ako [[$ VAR1 = 1]]; zatim ispišitef "1 \ n" elif [[$ VAR1 = 2]]; zatim ispišitef "2 \ n" elif [[$ VAR1 = 3]]; zatim printf "3 \ n" inače printf "none \ n" fi
U slučaju posljednjeg «Elif»Pročitat će se mnogi uvjeti. U slučaju da se ovaj postupak pojednostavljuje:
VAR1 = $ 1 slučaj $ VAR u 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 ili 4, ovisi \ n" ;; *) printf "none \ n" ;; da je C
Čitat će se varijabla, u ovom slučaju VAR1, i vidjet će se je li ekvivalentna bilo kojem od slučajeva, ako ne, izvršit će se zadani slučaj "*". Dvostruke točke sa zarezom ekvivalentne su «razbiti«, Kažu«slučaj»To mora završiti.
7. Petlje
Vrlo je malo petlji poznato u bilo kojem programskom jeziku. U Bashu su «dok„”dok»Y«za«. O ovome je već napisano u blogu:
Postoje dvije vrste petlji «za«, Oni koji su tipa«$ za VAR u LOQUESEA»A što su od tipa C«$ za ((I = 0; I <= 10; I ++))«. Druga vrsta petlji «za»Vrlo su korisni, ima 3 dijela na početku petlje:
- Izjava i pokretanje varijabli (u ovom slučaju pomoćna varijabla "I = 0").
- Uvjet izvršenja (sve dok ne budem manji ili jednak 10).
- Povećanje pomoćne varijable
Po mom mišljenju to je najmoćnija petlja od svih. Primjer koji ispisuje sve brojeve od 0 do 10, uključujući:
#! / bin / bash za ((I = 0; I <= 10; I ++)); učiniti printf "$ I \ n" gotovo
8. Funkcije
Postoje neke stvari koje nam Bash ne dopušta, zar ne? Na prvi pogled bash funkcije sprječavaju vas da napravite 3 stvari: deklariranje lokalnih varijabli u funkcijama, prosljeđivanje parametara funkcijama i vraćanje parametara. Sve ima rješenje.
Ne radite ništa poput:
#! / bin / bash VAR = 1 printc "$ VAR \ n" funkcija pozdrav () {VAR = 2 printf "$ VAR \ n"} pozdrav printf "$ VAR \ n"
Ovo se ispisuje na zaslone 1, 2 i 2.
Da biste deklarirali lokalne varijable, dodajte «lokalne»Prilikom izjave:
#! / bin / bash VAR = 1 printf "$ VAR1 \ n" funkcija foo () {lokalni VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"
Ovo ispisuje 1, 1, 2, 1 na zaslon.
Kako prosljeđujete parametre funkciji?
#! / bin / bash # - * - KODIRANJE: UTF-8 - * - funkcija zdravo () {printf "Pozdrav $ 1 \ n"}
printf "Kako se zoveš? \ n"
pročitajte VAR1
bok $ VAR1
Kako se vraćaju parametri?
#! / bin / bash # - * - KODIRANJE: UTF-8 - * - funkcija hello () {printf "Hello holita"} printf "Kako se zoveš? \ n" pročitaj VAR1 VAR1 = $ (hello) # EVO GDJE JE printf "$ VAR1 $ VAR2 \ n"
Kao što vidite, ovo ima dva nedostatka, možete vratiti samo jedan parametar, koji može biti vektor 😀, a ako želite vratiti parametar, više ne možete ispisivati na ekranu iz te funkcije.
9. Getopi
Jedna od posljednjih stvari koje trebate znati o Bashu za stvaranje složenih skripti je «getopi«. Koristi se za prosljeđivanje opcija skripti bez obzira na redoslijed. Jedina mana je što utječe samo na kratke opcije:
#! / bin / bash # - * - KODIRANJE: UTF-8 - * - VARC = 0 funkcija help () {printf "Poruka pomoći \ n" exit} ako [[-z $ 1]]; zatim pomozite fi dok getopts: ha: b: c OPT; učiniti slučaj $ OPT u h) pomoć ;; :) Pomozite ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) Pomozite ;; esac done # Glavni blok skripte koji # radi stvari s VARA, VARB i VARC
«getopts»Čita opcije jednu po jednu, pa je potrebna petlja.
Postoje 2 vrste opcija koje se mogu proslijediti pomoću «getopti„:
- Parametri zvani zastave, u ovom slučaju -c ili -h. Navedeni su slovom koje želimo koristiti. Oni su poput logičkih varijabli, «istinski»(Jesu) ili«lažan"(Oni nisu ovdje).
- Parametri s pridruženim argumentima, -a bilo što, -b bilo što. Navedeni su slovom koje želimo s dvotačkom u nastavku. Argument je pohranjen u OPTARG (ovo je ime nepromjenjivo).
Što radi ova skripta?
Prikazuje poruku pomoći kada nije proslijeđena nijedna opcija, kada je proslijeđen parametar "-h", kada je proslijeđen nevažeći parametar (na primjer "-x", to čini "\?") Ili kada je važeći parametar argument (":"). U ostalim slučajevima sprema prisutnost "-c" kao 1 u VARC, a vrijednosti proslijeđene s "-a" i "-b" u VARA i VARB.
MAJSTORSKI. Ne kažem više U_U
Pozdrav, jako dobar članak.
Hej, stavili ste da date dozvole sudo + x umjesto chmod + x
$ sudo chmod + x script.sh
(Točnije, hehe)
Ah, čestitam i hvala!
Vrlo dobar post, zaista vam čestitam, nastavite tako, pozdrav
A ako želite da skripta bude vidljiva kad se izvrši, korak po korak, vidjevši na primjer kako se ponašaju varijable, uvjeti i sve drugo, možete koristiti:
skripta sh -x
pozdravi
KOMAD tutorstva. Izvrsno i vrlo dobro objašnjeno.
Hvala Vam.
Odličan post na tu temu 😉
Vrlo zanimljivo i važno, hvala na informacijama ...
ŽIVJELI !!!
Hvala svima na čestitkama, što se tiče zapovijedi Miguel, ne dopušta mi da izmijenim unos nakon što se objavi. Morat ću to učiniti, pretpostavljam.
Vrlo dobro!
Prije svega, želio sam vam čestitati na postu, bilo mi je lako razumjeti i stvarno pomaže slijediti smjernice za dobro programiranje u bashu, posebno za ljude koji počinju programirati.
Međutim, pronašao sam nekoliko detalja koje mislim da bi trebalo ispraviti.
Prvo: u odjeljku «2. STRUKTURA SKRIPTA »funkcija nije zatvorena, što će uzrokovati probleme prilikom izvršavanja u skripti.
Rješenje bi bilo dodati joj zatvarač odmah nakon naredbe "exit".
Drugo: u odjeljku «4. PROČITAJTE KORISNIČKI ULAZ “potvrđujete da se parametri koje korisnik može unijeti kreću od 0 do beskonačno, međutim,„ bash “će tumačiti samo od 0 do 9 dolara, jer bi 10 dolara bilo jednako 1 USD + 0.
Da biste riješili ovaj problem, možete upotrijebiti naredbu "shift" da biste zgrabili sljedeće varijable. Ili navedite varijablu u zagradama "$ {10}", tako da bash uzima vrijednosti zajedno, a ne kao $ 1 + 0.
Bez daljnjeg, pozdrav!
Hvala na komentaru. Potpuno nije uspio objasniti ispravnu upotrebu izlaza, kako u skripti, tako i u funkcijama. Što se tiče {10} dolara, nikada nisam toliko zavještao, pa nisam naišao na taj problem, dobro je znati da za to postoji rješenje (već sam prekrižio novu stvar koja sam danas naučio 😀).
Puno vam hvala na članku! Neke stvari koje spominjete još uvijek nisu imale pojašnjenja. Na primjer, getops.
U dijelu izlaza sa zaslona morali ste spomenuti mačku koju kasnije spominjete ...
mačka <
***************************************
* OVAJ OBRAZAC JE VRLO IZRAZIT *
***************************************
EOF
U vašem primjeru:
mačka << EOF >> test.sh
Treba spomenuti dvije stvari ... >> to je 'dodaj', odnosno ako ponovite istu naredbu, imat ćete cijelu skriptu u duplikatu ... Trebali biste koristiti samo jednu ...
mačka << EOF> script.sh
Da, trebao bi se zvati i script.sh
Zatim u
ako [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoć"]]; zatim
pomoći
fi
Mislim da bi to trebalo napisati ...
ako [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoć"]]; zatim
...
Iz BASH-a možete otkriti još mnogo toga.
Možete li ga nasloviti "OSNOVE"? 🙂
Na primjer, parametar 'testeri' poput -z da vidi jesu li prazni ili -f da vidi postoji li kao datoteka.
Hvala još jednom na vašem trudu.
Alberto
Vrlo dobar tutorial bash skripte!
-- KODIRANJE: UTF-8 --
To je prvi put da vidim taj redak za postavljanje kodiranja znakova u bash skripti. Čini mi se više kao Python nego Bash. Je li stvarno potrebno? Potražio sam referencu na Googleu, ali ne mogu pronaći ništa, imate li pri ruci vezu koja govori o ovom pitanju? Konkretno o prikladnosti te linije.
Po mom mišljenju, za pisanje skripti u Bashu pomoću UTF-8 trebate samo spremiti tekstualnu datoteku kao takvu (bez BOM-a) i imati ispravno postavljene određene varijable okruženja (LANG i LC_ *).
Tada je, očito, potrebno da se izvršene naredbe pripreme za kodiranje osim ASCII. Na primjer, ako želimo preći na velika slova, čini se da ovo ne funkcionira:
«Echo áéíóú | tr az AZ »
o:
«Echo áéíóú | tr [: donji:] [: gornji:] »
i bolje je koristiti:
«Echo áéíóú | awk '{print toupper ($ 0)}' ».
O "kodiranje»Već je spomenuto na ovom blogu:
Bash: kako napraviti skriptu izvršnom
Skripta uslužnog programa za instalaciju
Netko me ispravio, ali ta linija kodiranja (# -- KODIRANJE: UTF-8 --) To nema nikakve veze s bashom ili ljuskom: to je redak komentara (započinje s #) i služi za uređivanje UREDNIKA koji koristimo za pisanje skripte (vim, emacs ...) kodiranja datoteke.
Zapravo, bash ne vidi takav redak, jer je to redak komentara.
Izvrsna lekcija, jer Sysadmin zna poznavanje skriptiranja u Bashu, što je korisno za sve.
Jako jako dobro!
Pozdrav!
U slučaju da je nekome korisno, evo nekoliko načina i primjera za stvaranje vlastitih skripti: https://github.com/reduardo7/hsabx
Vrlo dobro. Nove stvari koje treba dodati mojim skriptama. Stvar s encodig-om i printf-om to nisu imali.
Hvala vam!!!
Paoo dobar članak! Ovu držim za favorite, bilo bi lijepo ispraviti pogrešno i čak proširiti s više sadržaja. Pljesak za sve ove informacije !!!!