0. Indeksi
- Gjërat që u ndodhin shumicës së njerëzve
- Struktura e një skenari
- Printo në ekran
- Lexoni përdoruesin INPUT
- Llogaritjet në bash
- Kushtet
- Sythe
- funksionet
- kapjet
1. Gjërat që u ndodhin shumicës së njerëzve
/ bin / bash ose / bin / sh
Një nga gjërat e para që bën makineria kur ekzekuton skenarin tonë është të shikojmë me cilën predhë duhet ta bëjë atë. Në shumicën e sistemeve aktuale linux / Bin / sh është një lidhje për të / bin / bash, por kjo nuk është gjithmonë rasti, për shembull në shpërndarjet që përdorin kuti e zënë sjell Sh dhe zakonisht ato gjithashtu sjellin Përplas, por nëse e përdorni / Bin / sh, nuk do të funksionojë me Bash. Kjo është arsyeja pse unë rekomandoj që gjithmonë të përdorni / bin / bash.
Unicode kundrejt ASCII
A keni menduar ndonjëherë pse nuk mund të përdorni "¿" ose "" në skenarët tuaj? Apo përdorni thekse? Mund të jetë mjaft i bezdisshëm në skenarët ndërveprues. Kjo është për shkak se kodimi i paracaktuar i Bash është ASCII, ose çfarë është e njëjtë, grupi i karaktereve angleze. Për ta ndryshuar atë, ne vetëm duhet t'i themi skenarit tonë se duam të përdorim Unicode. Për këtë ju duhet të shtoni një rresht menjëherë pas interpretuesit të komandës:
# - * - Kodimi: UTF-8 - * -
Kini kujdes, është e rëndësishme që kjo linjë të jetë në fillim të skenarit.
Bëni skenarin të ekzekutueshëm
Funnyshtë qesharake me sa njerëz drejtojnë skenarët me «skenari $ bash.sh" në vend të "$ ./script.shNë fund të fundit, kjo është ajo për të cilën ne kemi përcaktuar një predhë.
Për të shtuar lejet e ekzekutimit, duhet të ekzekutoni:
sudo + x shkrim.sh
BIN = "dosje ku kemi skriptet" PATH = "$ BIN $ PATH"
2. Struktura e një skenari
- Ballore
- Përkufizimi i ndryshoreve globale
- Ndihmë
- funksionet
- Trupi kryesor
Titulli është vendi ku ne tregojmë se cilën shell duam të përdorim dhe kodimin. Avantazhi i funksioneve është të ripërdorin kodin që përsëritet duke e shkruar atë vetëm një herë dhe për ta bërë më të lehtë për të kuptuar skenarin, për kodin që tejkalon 100 rreshta është shumë i dobishëm.
Për të përdorur funksionet, ato duhet të përcaktohen para trupit kryesor të shkrimit tonë. Dhe nëse duam të përdorim variabla në nivelin global të të gjithë shkrimit tonë, si në trupin kryesor ashtu edhe në funksionet, duhet t'i përcaktojmë ato në fillim të gjithçkaje, menjëherë pas kokës.
Së fundmi, është praktikë e mirë të shkruash një funksion ndihmës kur skenari ynë funksionon keq ose me parametra të këqij. Padyshim, në ato raste ne duam të dalim nga skenari menjëherë, pa lexuar funksionet. Për këtë mund të përdorim:
ndihma e funksionit () {echo "" "Teksti ynë i mirë-formatuar i ndihmës." "" dilni nëse [[-z $ 1 || $ 1 == "-h" || $ 1 == "--ndihmoni"]]; atëherë ndihmoni fi
Nëse shtojmë "dalje" në funksionin e ndihmës, do të dalim nga skenari sa herë që përdorim ndihmën, për shembull pas mesazheve të gabimit, etj. Ne ruajmë disa rreshta të kodit.
Kushti tregon ndihmën e shfaqjes në ekran dhe dilni nëse skenari ekzekutohet pa parametra ose nëse specifikohet -h / –help. Nëse e shikoni, kjo është sjellja standarde e shumicës së programeve linux.
3. Printo në ekran
Ekzistojnë 2 komanda kryesore për shtypjen në ekran në bash: «humbas»Y«printf« Ata të dy janë po aq të shpejtë dhe të dy janë pjesë e bash. Dallimi kryesor për një fillestar është që jehona shton një linjë të re në fund, ndërsa «printf"Nuk.
Echo është shumë e mirë dhe është ajo që përdorin shumica e njerëzve, megjithatë kur lexoni INPUT-in e përdoruesit, ose kur dëshironi të shtypni variablat e marrë nga skedarët me përpunimin e tekstit, gjëra të çuditshme mund të ndodhin. Ato zakonisht zgjidhen lehtësisht, aq lehtë sa ndryshimi i kuotave të dyfishta në të vetme ose anasjelltas, ose marrja e referencave të ndryshueshme nga kuotat. «jehonë»A bën gjëra të çuditshme edhe në varësi të mënyrës se si është përpiluar, nëse përdorim gjithmonë Ubuntu ose gjithmonë Fedora, kjo nuk ndikon tek ne, por nëse ndryshojmë shpërndarjen që bën.
Kjo është arsyeja pse unë përdor «printf«, Që nuk më dhemb koke dhe gjithashtu sillet më shumë si«printf»Nga C ose«shtyp»Nga Python, kjo është shumë e rëndësishme nëse doni ndonjëherë ta transferoni skriptin tuaj në një gjuhë tjetër programimi.
4. Lexoni INPUT-in e përdoruesit
Gjithçka që shkruajmë pas emrit të shkrimit tonë dhe para se të godasim tastin ENTER ruhet automatikisht në variabla të veçantë. Këto variabla janë të tipit $ X ku X është një numër.
«$0»Tregon emrin e shkrimit tonë dhe nga«$1»Në pafundësi gjithçka që kemi shkruar më vonë është e ndryshueshme. Për shembull:
mace << EOF >> test.sh #! / bin / bash # - * - Kodimi: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n" EOF chmod + x script.sh ./script.sh skedari im.txt
Ne krijojmë një skenar provë, e bëjmë të ekzekutueshëm dhe e ekzekutojmë me 2 parametra. Ne marrim daljen e ekranit të:
$ 0 = ./script.sh $ 1 = im $ 2 = skedar.txt
Duke përdorur citate mund të kishim kaluar "file.txt tim" në "$ 1".
Mund të lexojmë edhe INPUT-in e një përdoruesi me komandën "read", duke treguar direkt variablin ku duam të ruajmë parametrin. Për shembull:
printf "Si e ke emrin? \ n" lexo NAME printf "Përshëndetje, $ NAME. \ n"
5. Llogaritjet në Bash
Për këtë mund të përdorim «eksp«, Për sa kohë që nuk kemi nevojë të bëjmë llogaritje komplekse. Duhen theksuar dy gjëra, e para është se «eksp»Vetëm pranon numrat e plotë, e dyta është se ndarja kthen rezultatin e plotë, për të parë pjesën tjetër që mund të përdorim«%".
Zakonisht ne dëshirojmë të caktojmë rezultatin e expr në një ndryshore. Ne mund ta bëjmë atë në dy mënyra:
VAR2 = `expr $ VAR1 / 10` VAR2 = $ (expr $ VAR1 / 100)
Ju gjithashtu mund të kaloni «eksp»Përdorimi i kllapave të dyfishta:
VAR2 = $ (($ VAR1 / 100))
6. Kushtet
Tashmë është shkruar gjatë për «if" 'tjetër" 'elif»Dhe kushtet. Mund të lexoni për këtë në:
- Programimi në bash: pjesa 1
- Bash: nëse, atëherë, kushtet e tjera
- Kontrolloni nëse një skedar apo dosje ekziston apo jo dhe më shumë me një lak if
- Programimi në bash: pjesa 2
Unë thjesht dua të theksoj ndryshimin midis përdorimit të kllapave të thjeshta katrore, «[]«, Dhe kllapa dyshe,«[[]]«, Për kushtet. Me kllapa të dyfishtë mund të përdorim kushte shtesë:
- «&&»Për dhe
- «||»Për ose
Per te perdorur "&&»Y«||»Me kllapa të thjeshtë katrore, secila pjesë duhet të ndahet në kllapa të veçantë katrorë. Shembulli i përdorur për pjesën e skenarit që duket për të parë nëse ndihma duhet të ekzekutohet do të ishte:
nëse [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- ndihmë"]]; atëherë ndihmoni fi
Kjo gjithashtu na shpëton nga detyrimi për të shkruar emra të ndryshueshëm në thonjëza për të parandaluar gabimet. Për shembull:
nëse [$ 1 = 1]; atëherë printf "Parametri është i barabartë me 1."; fi nëse ["$ 1" = 1]; atëherë printf "Parametri është i barabartë me 1."; fi nëse [[$ 1 = 1]]; atëherë printf "Parametri është i barabartë me 1."; fi
Nëse script.sh ekzekutohet pa ndonjë parametër, rasti i parë do të jepte një gabim:
bash: [: =: pritet operatori unary
Ajo për të cilën nuk është biseduar është «rast«, Përdoret për të thjeshtuar«if« Le të fillojmë në fillim, kur nuk kemi ndonjë «if»I gjithë kodi do të ekzekutohet. Nëse shtojmë një kusht «if»Do të kemi dy raste, një në të cilën blloku i kodit brenda«if»Dhe rasti tjetër kur ky bllok nuk ekzekutohet.
Nëse shtojmë një «tjetër«Ne gjithashtu do të kemi dy raste, por këto dy raste janë të ndryshme nga ato të mëparshmet. Sepse tani do të ketë dy blloqe të kodit të kushtëzuar, A dhe B, dhe një bllok C, që është pjesa tjetër e programit. A ose B do të ekzekutohet, dhe C. Në rastin e mëparshëm ishin A dhe C ose vetëm C.
Për të shmangur kushtet e shkrimit «nese Tjeter"brenda"tjetër»Dhe për të thjeshtuar leximin e kodit, ai u krijua«elif« Kur kemi shumë kushte që varen nga e mëparshmja, për shembull diapazoni i numrave ose lloji:
VAR1 = $ 1 nëse [[$ $ VAR1 = 1]]; atëherë printf "1 \ n" elif [[$ VAR1 = 2]]; atëherë printf "2 \ n" elif [[$ VAR1 = 3]]; pastaj printf "3 \ n" tjetër printf "asnjë \ n" fi
Në rastin e «funditelif»Shumë kushte do të lexohen. Në rast se ky proces është i efektshëm:
VAR1 = $ 1 rast $ VAR në 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 ose 4, varet \ n" ;; *) printf "asnjë \ n" ;; se C
Do të lexohet një ndryshore, në këtë rast VAR1, dhe do të kontrollohet nëse është ekuivalente me ndonjë nga rastet, nëse jo, rasti i parazgjedhur "*" do të ekzekutohet. Pikëpresjet dyshe janë ekuivalente me «pushim«, Ata tregojnë«rast»Kjo duhet të marrë fund.
7. Sythe
Shumë pak sythe dihen në çdo gjuhë programimi. Në Bash ata janë «ndërsa" 'deri»Y«për« Blogshtë shkruar tashmë në blog për këto:
Ekzistojnë dy lloje të sytheve «për«, Ata që janë të tipit«$ për VAR në LOQUESEA»Dhe cilat janë të tipit C«$ për ((I = 0; I <= 10; I ++))« Lloji i dytë i sytheve «për»Janë shumë të dobishme, ka 3 pjesë në fillim të lakut:
- Deklarimi dhe fillimi i ndryshoreve (Në këtë rast një ndryshore ndihmëse "I = 0").
- Kushti i ekzekutimit (derisa të jem më i vogël ose i barabartë me 10).
- Rritja e ndryshores ndihmëse
Për mendimin tim është lak më i fuqishëm nga të gjithë. Një shembull, i cili shtyp të gjithë numrat nga 0 në 10, përfshirë:
#! / bin / bash për ((I = 0; I <= 10; I ++)); bëj printf "$ I \ n" e bërë
8. Funksionet
Ka disa gjëra që Bash nuk na lejon të bëjmë, apo jo? Në shikim të parë, funksionet bash ju ndalojnë të bëni 3 gjëra: deklarimi i ndryshoreve lokale në funksione, kalimi i parametrave te funksionet dhe kthimi i parametrave. Gjithçka ka një zgjidhje.
Mos bëni asgjë si:
#! / bin / bash VAR = 1 printc funksioni "$ VAR \ n" përshëndetje () {VAR = 2 printf "$ VAR \ n"} përshëndetje printf "$ VAR \ n"
Kjo shtyp në ekranin 1, 2 dhe 2.
Për të deklaruar ndryshoret lokale, shtoni «lokal»Kur deklaroni:
#! / bin / bash VAR = 1 printf funksioni "$ VAR1 \ n" foo () {lokale VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"
Kjo shtyp 1, 1, 2, 1 në ekran.
Si i kaloni parametrat në një funksion?
#! / bin / bash # - * - Kodimi: UTF-8 - * - funksioni përshëndetje () {printf "Përshëndetje $ 1 \ n"}
printf "Si e ke emrin? \ n"
lexo VAR1
pershendetje $ VAR1
Si kthehen parametrat?
#! / bin / bash # - * - Kodimi: UTF-8 - * - funksioni përshëndetje () {printf "Përshëndetje holita"} printf "Si e ke emrin? \ n" lexo VAR1 VAR1 = $ (përshëndetje) # KETU ISSHT printf "$ VAR1 $ VAR2 \ n"
Siç mund ta shihni kjo ka dy pengesa, ju mund të ktheni vetëm një parametër, i cili mund të jetë një vektor 😀, dhe nëse doni të ktheni një parametër, nuk mund të printoni më në ekran nga ai funksion.
9. Getops
Një nga gjërat e fundit që duhet të dini rreth Bash për të krijuar skenare komplekse është «helmet« Përdoret për të kaluar opsionet në skenar pavarësisht nga rendi. E vetmja gjë e dobët është se ndikon vetëm në opsionet e shkurtra:
#! / bin / bash # - * - Kodimi: UTF-8 - * - Ndihma e funksionit VARC = 0 () {printf "Mesazh ndihme \ n" dalje} nëse [[-z $ 1]]; atëherë ndihmoni fi gjatë marrjes: ha: b: c OPT; bëj rastin $ OPT në h) ndihmë ;; :) ndihmë ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) ndihmë ;; esac done # Blloku kryesor i skenarit që # bën gjëra me VARA, VARB dhe VARC
«Getopt»Lexon opsionet një nga një, kështu që nevojitet një lak.
Ekzistojnë 2 lloje opsionesh që mund të kalohen duke përdorur «fillime':
- Parametrat e quajtur flamuj, në këtë rast -c ose -h. Ato specifikohen me shkronjën që duam të përdorim. Ata janë si variabla Boolean, «i vërtetë»(Janë) ose«i rremë"(Ata nuk janë këtu).
- Parametrat me argumente të shoqëruara, -a çdo gjë, -b çdo gjë. Ato specifikohen me shkronjën që duam me një dy pika më poshtë. Argumenti është ruajtur në OPTARG (ky emër është i pandryshueshëm).
Çfarë bën ky skenar?
Shfaq mesazhin e ndihmës kur nuk kalohet asnjë opsion, kur kalohet parametri "-h", kur kalon një parametër i pavlefshëm (për shembull "-x", kjo bëhet nga "\?") Ose kur një parametër i vlefshëm pa argument (":"). Në rastet e tjera kursen praninë e "-c" si 1 në VARC, dhe vlerat e kaluara me "-a" dhe "-b" në VARA dhe VARB.
MASTERLY. Unë nuk them më shumë U_U
Përshëndetje artikull shumë i mirë.
Hej ju vendosni të jepni leje sudo + x në vend të chmod + x
$ sudo chmod + x shkrim.sh
(Për të qenë më të saktë, hehe)
Ah, urime dhe faleminderit!
Post shumë i mirë, me të vërtetë ju përgëzoj, vazhdoni, Përshëndetje
Dhe nëse doni që skenari të jetë i dukshëm kur ekzekutohet, hap pas hapi, duke parë për shembull se si sillen variablat, kushtet dhe gjithçka, mund të përdorni:
shkrimi sh -x
të fala
PJES e tuto. E shkëlqyeshme dhe e shpjeguar shumë mirë.
Ju faleminderit.
Postim i shkëlqyeshëm për këtë temë
Shumë interesante dhe e rëndësishme, faleminderit për informacionin.
Gëzuar !!!
Faleminderit të gjithëve për urimet tuaja, pasi për komandën Miguel, ai nuk më lejon të modifikoj hyrjen sapo të botohet. Do të duhet të bëjë elavë që imagjinoj.
Shume mire!
Së pari, doja t'ju përgëzoja për postimin, e pata të lehtë për tu kuptuar dhe me të vërtetë ndihmon të ndiqni udhëzimet për të programuar mirë në bash, veçanërisht për njerëzit që kanë filluar të programojnë.
Sidoqoftë kam gjetur disa detaje të cilat mendoj se duhen korrigjuar.
Së pari: në seksionin «2. STRUKTURA E SHKRIMIT »funksioni nuk është i mbyllur, gjë që do të shkaktojë probleme gjatë ekzekutimit të tij në një skenar.
Zgjidhja do të ishte shtimi i një mbajtëse menjëherë pas komandës "dalje".
Së dyti: në seksionin «4. LEXONI SHTYPIN E PERRDORUESIT »ju pohoni se parametrat që përdoruesi mund të futë variojnë nga 0 $ deri në pafundësi, megjithatë« bash »do të interpretojë vetëm nga 0 $ në 9 $, pasi 10 $ do të ishte e barabartë me $ 1 + 0.
Për të zgjidhur këtë problem, ose mund të përdorni komandën "shift" për të kapur variablat e mëposhtëm. Ose specifikoni ndryshoren në kllapa "$ {10}", në mënyrë që bash të marrë vlerat së bashku, jo si $ 1 + 0.
Pa zhurmë të mëtejshme, përshëndetje!
Faleminderit per komentin tuaj Dështoi plotësisht për të shpjeguar përdorimin e saktë të daljes, si në skenar ashtu edhe në funksionet. Sa për {10} dollarë, unë kurrë nuk kam lënë trashëgim aq shumë, kështu që nuk e kam hasur në atë problem, është mirë të dihet se ekziston një zgjidhje për këtë (unë tashmë e kam përshkruar gjënë e re të mësuar sot).
Faleminderit shumë për artikullin! Disa gjëra që përmendni ende nuk kishin sqarime. Për shembull, getops.
Në pjesën e daljeve të ekranit, ju është dashur të përmendni macen që më vonë e përmendni ...
mace <
***************************************
* Kjo formë është shumë ekspresive *
***************************************
Eof
Në shembullin tuaj:
mace << EOF >> test.sh
Duhet të përmenden dy gjëra ... >> është 'append' që do të thotë, nëse përsërit të njëjtën komandë, do të kesh të gjithë skenarin në dy kopje ... Duhet të përdorësh vetëm një
mace << EOF> shkrimi.sh
Po, duhet të quhet edhe skript.sh
Pastaj në
nëse [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–ndihmoni"]]; atëherë
ndihmë
fi
Unë mendoj se duhet të shkruhet ...
nëse [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–ndihmoni"]]; atëherë
...
Ka shumë më shumë për të zbuluar nga BASH.
Mund ta titulloni "BAZAT"? 🙂
Për shembull, parametrat 'testues' pëlqejnë -z për të parë nëse janë bosh, ose -f për të ditur nëse ekziston si skedar.
Faleminderit përsëri për përpjekjen tuaj.
alberto
Një udhëzues shumë i mirë për skenarin bash!
-- Kodimi: UTF-8 --
Kjo është hera e parë që kam parë atë linjë për të vendosur kodimin e karakterit në një skenar bash. Më duket më shumë si Python sesa Bash. A është vërtet e nevojshme? Unë kam kërkuar për një referencë në Google por nuk mund të gjej asgjë, a keni një lidhje në dorë që flet për këtë çështje? Konkretisht mbi përshtatshmërinë e asaj linje.
Sipas mendimit tim, për të shkruar skripte në Bash duke përdorur UTF-8, duhet të ruani vetëm skedarin e tekstit si të tillë (pa BOM) dhe të keni disa variabla të mjedisit, (LANG dhe LC_ *), të vendosura saktë.
Atëherë, padyshim, është e nevojshme që komandat e ekzekutuara të përgatiten për kodime të ndryshme nga ASCII. Për shembull, nëse duam të konvertohemi në të madhe, kjo nuk duket se funksionon:
«Echo áéíóú | tr az AZ »
o:
«Echo áéíóú | tr [: poshtme:] [: sipërme:] »
dhe është më mirë të përdorni:
«Echo áéíóú | awk '{shtypës i shtypur ($ 0)}' ».
Rreth «encoding»Beenshtë përmendur në këtë blog më parë:
Bash: si ta bëjmë një skenar të ekzekutueshëm
Shkrimi i shërbimeve postare të instalimit
Dikush më korrigjon, por ajo vijë e kodimit (# -- Kodimi: UTF-8 --) Nuk ka asnjë lidhje me bash ose shell: është një linjë komenti (fillon me #) dhe shërben për t'i thënë EDITORIT që ne përdorim për të shkruar skenarin (vim, emacs ...) kodimin e skedarit.
Në fakt, bash nuk e sheh një linjë të tillë, sepse është një linjë komenti.
Një mësim i shkëlqyeshëm, pasi Sysadmin e njeh Shkrimin në Bash është thelbësor, është i dobishëm për gjithçka.
Shumë Shumë i mirë!
Përshëndetje!
Në rast se është i dobishëm për këdo, këtu janë disa përdorime dhe shembuj për të krijuar Skriptet tuaja: https://github.com/reduardo7/hsabx
Shume mire. Gjëra të reja për të shtuar në shkrimet e mia. Gjëja e kodifikuar dhe printf nuk e kishte atë.
Faleminderit!!!
Artikull shumë i mirë! E mbaj këtë për të preferuarat, do të ishte mirë të korrigjoja atë që nuk shkon dhe madje ta zgjeroj me më shumë përmbajtje. Një duartrokitje për të gjitha këto informacione !!!!