0. Hakemisto
- Asiat, joita tapahtuu useimmille ihmisille
- Komentosarjan rakenne
- Tulosta näytölle
- Lue käyttäjän INPUT
- Laskelmat bash
- Ehdot
- Silmukat
- Funciones
- getops
1. Asiat, joita tapahtuu useimmille ihmisille
/ bin / bash tai / bin / sh
Yksi ensimmäisistä asioista, joita kone tekee komentosarjaa suorittaessaan, etsii, minkä kuoren kanssa sen pitäisi tehdä. Useimmissa nykyisissä Linux-järjestelmissä / Bin / sh on linkki / bin / bash, mutta näin ei ole aina, esimerkiksi jakeluissa, jotka käyttävät busybox he tuovat Sh ja yleensä he myös tuovat Kemut, mutta jos käytät / Bin / sh, se ei toimi Bashin kanssa. Siksi suosittelen aina käyttöä / bin / bash.
Unicode vs. ASCII
Oletko koskaan miettinyt, miksi et voi käyttää "¿" tai "ñ" skripteissäsi? Tai käyttää aksentteja? Se voi olla melko ärsyttävää interaktiivisissa skripteissä. Tämä johtuu siitä, että Bashin oletuskoodaus on ASCII tai mikä on sama, englanninkielinen merkistö. Jos haluat muuttaa sitä, meidän on vain kerrottava skriptille, että haluamme käyttää Unicodea. Tätä varten sinun on lisättävä rivi heti komentotulkin jälkeen:
# - * - KOODAUS: UTF-8 - * -
Ole varovainen, on tärkeää, että tämä rivi on skriptin alussa.
Tee komentosarja suoritettavaksi
On hauskaa, kuinka monet ihmiset ajavat komentosarjoja «$ bashscript.sh"eikä"$ ./script.sh'Loppujen lopuksi olemme määrittäneet kuoren.
Suoritusoikeuksien lisäämiseksi sinun on suoritettava:
sudo + x script.sh
BIN = "kansio, jossa meillä on skriptit" PATH = "$ BIN $ PATH"
2. Komentosarjan rakenne
- Pää
- Globaalien muuttujien määritelmä
- Auttaa
- Funciones
- Päärunko
Otsikossa ilmoitetaan käytettävä kuori ja koodaus. Toimintojen etuna on käyttää uudelleen toistettavaa koodia kirjoittamalla se vain kerran ja helpottaa komentosarjan ymmärtämistä. 100 riviä ylittävälle koodille on erittäin hyödyllistä.
Toimintojen käyttämiseksi ne on määriteltävä komentosarjamme pääosassa. Ja jos haluamme käyttää muuttujia koko käsikirjoituksemme globaalilla tasolla, niin pääkappaleessa kuin funktioissa, meidän on määriteltävä ne kaiken alussa, juuri otsikon jälkeen.
Lopuksi on hyvä käytäntö kirjoittaa auttajatoiminto, kun komentosarjamme toimii huonosti tai parametreilla. On selvää, että näissä tapauksissa haluamme poistua komentosarjasta välittömästi lukematta toimintoja. Tätä varten voimme käyttää:
function help () {echo "" "Hyvin muotoiltu ohjetekstimme." "" poistu jos [[-z $ 1 || $ 1 == "-h" || $ 1 == "--apu"]]; sitten auttaa fi
Jos lisätään "exit" ohjetoimintoon, poistumme komentosarjasta aina, kun suoritamme apua, esimerkiksi virheilmoitusten tms. Jälkeen. Tallennamme muutaman rivin koodia.
Ehto kertoo näytön ohjeista ja poistumisesta, jos komentosarja suoritetaan ilman parametreja tai jos -h / –help on määritetty. Jos katsot sitä, se on useimpien linux-ohjelmien vakiokäyttäytyminen.
3. Tulosta näytölle
Bash-näytössä tulostamista varten on kaksi pääkomentoa: «kaiku»Y«printf«. Ne ovat molemmat yhtä nopeita ja molemmat ovat osa bashia. Tärkein ero aloittelijoille on, että kaiku lisää uuden rivin loppuun, kun taas «printf»Ei.
Kaiku on erittäin hyvä ja sitä useimmat ihmiset käyttävät, mutta lukiessaan käyttäjän INPUT-syötettä tai kun haluat tulostaa tiedostoista tekstinkäsittelyllä otettuja muuttujia, voi tapahtua outoja asioita. Ne on yleensä helppo ratkaista, yhtä helppoa kuin vaihtaa kaksoislainausmerkit yksittäisiksi tai päinvastoin tai ottaa muuttujaviitteet pois lainauksista. «Echo»Tekeekö outoja asioita myös sen mukaan, miten se on koottu, jos käytämme aina Ubuntua tai aina Fedoraa, se ei vaikuta meihin, mutta jos muutamme sen jakelua.
Siksi käytän «printf«, Joka ei aiheuta minulle päänsärkyä ja käyttäytyy myös enemmän«printf»Kohdasta C tai«painaa»Python, tämä on erittäin tärkeää, jos haluat koskaan siirtää komentosarjan toiselle ohjelmointikielelle.
4. Lue käyttäjän INPUT
Kaikki, mitä kirjoitamme skriptin nimen jälkeen ja ennen kuin painamme ENTER-näppäintä, tallennetaan automaattisesti erityisiin muuttujiin. Nämä muuttujat ovat tyyppiä $ X, jossa X on luku.
«$0»Ilmaisee käsikirjoituksemme nimen ja$1»Äärettömyyteen kaikki, mitä olemme kirjoittaneet myöhemmin, vaihtelevat. Esimerkiksi:
kissa << EOF >> test.sh #! / bin / bash # - * - KOODAUS: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n "EOF chmod + x script.sh ./script.sh tiedostoni.txt
Luomme testikoodin, teemme sen suoritettavaksi ja suoritamme sen kahdella parametrilla. Saamme näytön ulostulon:
$ 0 = ./script.sh $ 1 = minun $ 2 = tiedosto.txt
Lainausmerkkejä käyttämällä olisimme voineet välittää "my file.txt" tiedostolle "$ 1".
Voimme myös lukea käyttäjän INPUT-komennon "read" -komennolla ja osoittaa suoraan muuttujan, johon haluamme tallentaa parametrin. Esimerkiksi:
printf "Mikä nimesi on? \ n" lue NIMI printf "Hei, $ NAME. \ n"
5. Laskelmat Bashissa
Tätä varten voimme käyttää «lauseke«, Niin kauan kuin meidän ei tarvitse tehdä monimutkaisia laskelmia. Kaksi asiaa on pantava merkille, ensimmäinen on se, että «lauseke»Hyväksyy vain kokonaisluvut, toinen on se, että jakaminen palauttaa koko tuloksen, jotta voimme nähdä loput, joita voimme käyttää«%".
Yleensä haluamme määrittää lausekkeen tuloksen muuttujalle. Voimme tehdä sen kahdella tavalla:
VAR2 = `expr $ VAR1 / 10` VAR2 = $ (expr $ VAR1 / 100)
Voit myös ohittaa «lauseke»Kaksoissulkeiden käyttö:
VAR2 = $ (($ VAR1 / 100))
6. ehdot
Se on jo kirjoitettu hyvin laajasti «if""muu""elif»Ja olosuhteet. Voit lukea siitä:
- Ohjelmointi Bashissa: osa 1
- Bash: jos sitten muut olosuhteet
- Tarkista, onko tiedosto tai kansio olemassa vai ei, ja muuta if-silmukalla
- Ohjelmointi Bashissa: osa 2
Haluan vain korostaa eroa yksinkertaisten hakasulkeiden, «[]«Ja kaksoissulkeet,«[[]]«, Olosuhteisiin. Kaksoissulkeilla voimme käyttää lisäehtoja:
- «&&»Ja
- «||»For tai
Käyttää "&&»Y«||»Yksinkertaisilla hakasulkeilla kukin osa tulisi erottaa erillisissä hakasulkeissa. Esimerkki, jota käytetään komentosarjan siinä osassa, joka etsii, onko apua suoritettava, olisi:
jos [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--apu"]]; sitten auttaa fi
Se myös säästää meitä joutumasta kirjoittamaan muuttujien nimet lainausmerkkeihin virheiden välttämiseksi. Esimerkiksi:
jos [$ 1 = 1]; sitten printf "Parametri on yhtä suuri kuin 1."; fi jos ["$ 1" = 1]; sitten printf "Parametri on yhtä suuri kuin 1."; fi jos [[$ 1 = 1]]; sitten printf "Parametri on yhtä suuri kuin 1."; fi
Jos script.sh suoritetaan ilman parametreja, ensimmäinen tapaus antaa virheen:
bash: [: =: odotettavissa yksi operaattori
Mitä ei ole keskusteltu, on «tapaus«, Käytetään yksinkertaistamaan«if«. Aloitetaan alusta, kun meillä ei ole yhtään «if»Kaikki koodi suoritetaan. Jos lisätään ehto «if»Meillä on kaksi tapausta, joista yksi koodilohko«if»Ja toinen tapaus, jossa tätä estoa ei suoriteta.
Jos lisätään «muu«Meillä on myös kaksi tapausta, mutta nämä kaksi tapausta eroavat edellisistä. Koska nyt on kaksi ehdollista koodilohkoa, A ja B, ja C-lohko, joka on loput ohjelmasta. A tai B suoritetaan ja C. Aikaisemmassa tapauksessa ne olivat A ja C tai vain C.
Kirjoitusehtojen välttämiseksi «tai muuten"sisällä"muu»Ja koodin lukemisen yksinkertaistamiseksi se luotiin«elif«. Kun meillä on monia ehtoja, jotka riippuvat edellisestä, esimerkiksi numeroalue tai tyyppi:
VAR1 = $ 1, jos [[$ VAR1 = 1]]; tulosta sitten "1 \ n" elif [[$ VAR1 = 2]]; tulosta sitten "2 \ n" elif [[$ VAR1 = 3]]; sitten printf "3 \ n" muuten printf "none \ n" fi
Viimeisten «elif»Monet ehdot luetaan. Tällöin tätä prosessia virtaviivaistetaan:
VAR1 = $ 1 tapaus $ VAR 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 tai 4, se riippuu \ n" ;; *) printf "ei mitään \ n" ;; että C
Muuttuja luetaan, tässä tapauksessa VAR1, ja nähdään, vastaako se jotakin tapauksista, jos ei, suoritetaan oletustapaus "*". Kaksinkertaiset puolipisteet vastaavat sanaa «rikkoa", He kertovat"tapaus»Sen on lopputtava.
7. Silmukat
Hyvin harvat silmukat tunnetaan millä tahansa ohjelmointikielellä. Bashissa he ovat «vaikka""asti»Y«varten«. Blogista on jo kirjoitettu näistä:
Silmukoita on kahta tyyppiä «varten«, Ne, jotka ovat tyyppiä«$ VAR: lle LOQUESEA: ssa»Ja mitkä ovat tyypin C«$ for ((I = 0; I <= 10; I ++))«. Toinen silmukatyyppi «varten»Ovat erittäin hyödyllisiä, siinä on 3 osaa silmukan alussa:
- Muuttujien ilmoittaminen ja aloittaminen (tässä tapauksessa apumuuttuja "I = 0").
- Suoritusehto (kunnes I on pienempi tai yhtä suuri kuin 10).
- Lisämuuttujan lisäys
Mielestäni se on kaikkien aikojen tehokkain silmukka. Esimerkki, joka tulostaa kaikki luvut 0-10, mukaan lukien:
#! / bin / bash ((I = 0; I <= 10; I ++)); tee printf "$ I \ n" valmis
8. Toiminnot
On joitain asioita, joita Bash ei salli meidän tehdä, eikö? Ensi silmäyksellä bash-toiminnot estävät sinua tekemästä 3 asiaa: paikallisten muuttujien ilmoittaminen funktioissa, parametrien välittäminen funktioille ja parametrien palauttaminen. Kaikella on ratkaisu.
Älä tee mitään:
#! / bin / bash VAR = 1 printc "$ VAR \ n" -toiminto hei () {VAR = 2 printf "$ VAR \ n"} hei printf "$ VAR \ n"
Tämä tulostaa näytöille 1, 2 ja 2.
Voit ilmoittaa paikalliset muuttujat lisäämällä «paikallinen»Ilmoitettaessa:
#! / bin / bash VAR = 1 printf "$ VAR1 \ n" -toiminto foo () {paikallinen VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"
Tämä tulostaa 1, 1, 2, 1 näyttöön.
Kuinka välität parametrit funktiolle?
#! / bin / bash # - * - KOODAUS: UTF-8 - * - toiminto hei () {printf "Hei $ 1 \ n"}
printf "Mikä nimesi on? \ n"
lue VAR1
hei $ VAR1
Kuinka parametrit palautetaan?
#! / bin / bash # - * - KOODAUS: UTF-8 - * - toiminto hei () {printf "Hello holita"} printf "Mikä nimesi on? \ n" lue VAR1 VAR1 = $ (hei) # TÄTÄ ON printf "$ VAR1 $ VAR2 \ n"
Kuten näette, tällä on kaksi haittapuolta, voit palauttaa vain yhden parametrin, joka voi olla vektori 😀, ja jos haluat palauttaa parametrin, et voi enää tulostaa näytölle kyseisestä toiminnosta.
9. Getops
Yksi viimeisistä asioista, jotka sinun on tiedettävä Bashista monimutkaisten komentosarjojen luomiseksi, on «getops«. Sitä käytetään siirtämään vaihtoehtoja skriptille järjestyksestä riippumatta. Ainoa haittapuoli on, että se vaikuttaa vain lyhyisiin vaihtoehtoihin:
#! / bin / bash # - * - KOODAUS: UTF-8 - * - VARC = 0 -toiminnon ohje () {printf "Ohjeviesti \ n" exit} jos [[-z $ 1]]; sitten auta fi samalla kun getopts: ha: b: c OPT; tee tapaus $ OPT h) apua ;; :) auta ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) auta ;; esac done # Komentosarjan päälohko, joka # tekee asioita VARA: n, VARB: n ja VARC: n kanssa
«getopts»Lukee vaihtoehdot yksi kerrallaan, joten tarvitaan silmukka.
«Vaihtoehtoja on 2 tyyppiä, jotka voidaan välittää«nousuja":
- Parametrit, joita kutsutaan lipuiksi, tässä tapauksessa -c tai -h. Ne on määritelty kirjaimella, jota haluamme käyttää. Ne ovat kuin Boolen muuttujia, «totta»(Are) tai«väärä"(He eivät ole täällä).
- Parametrit liitettyjen argumenttien kanssa, -a mitään, -b mitä tahansa. Ne on määritelty haluamallamme kirjaimella kaksoispisteellä. Argumentti on tallennettu OPTARG-tiedostoon (tätä nimeä ei voi muuttaa).
Mitä tämä käsikirjoitus tekee?
Näyttää ohjeviestin, kun mitään vaihtoehtoa ei välitetä, kun parametri "-h" välitetään, kun virheellinen parametri välitetään (esimerkiksi "-x", tämän tekee "\?") Tai kun kelvollinen parametri ilman argumenttia (":"). Muissa tapauksissa se säästää "-c": n läsnäolona 1: nä VARC: ssä ja arvot, jotka on välitetty "-a": lla ja "-b: llä" VARA: ssa ja VARB: ssa.
MESTARILLINEN. En sano enempää U_U
Hei, erittäin hyvä artikkeli.
Hei, annat käyttöoikeudet sudo + x chmod + x: n sijaan
$ sudo chmod + x script.sh
(Tarkemmin sanottuna, hehe)
Ah, onnittelut ja kiitos!
Erittäin hyvä viesti, totuus on, onnittelen teitä, jatka sitä, tervehdys
Ja jos haluat, että komentosarja on näkyvissä, kun se suoritetaan, askel askeleelta nähdäksesi esimerkiksi muuttujien, ehtojen ja kaiken käyttäytymisen, voit käyttää:
sh -x-komentosarja
terveiset
TARJOUKSEN Kappale. Erinomainen ja erittäin selitetty.
Kiitos.
Erinomainen viesti aiheesta 😉
Erittäin mielenkiintoinen ja tärkeä, kiitos tiedoista ...
KIPPIS !!!
Kiitos kaikille onnittelustanne, kuten Miguel-komennosta, hän ei anna minun muokata merkintää sen julkaisemisen jälkeen. Sen on tehtävä elav, kuvittelen.
Oikein hyvä!
Ensinnäkin halusin onnitella teitä viestistä, minusta oli helppo ymmärtää ja se todella auttaa noudattamaan ohjeita bash-ohjelmoinnille, etenkin ihmisille, jotka alkavat ohjelmoida.
Olen kuitenkin löytänyt muutaman yksityiskohdan, jotka mielestäni olisi korjattava.
Ensimmäinen: osassa «2. KOMPLEKTIN RAKENNE »toiminto ei ole suljettu, mikä aiheuttaa ongelmia suoritettaessa se komentosarjassa.
Ratkaisu olisi lisätä siihen sulkutuki heti "exit" -komennon jälkeen.
Toinen: osassa «4. LUE KÄYTTÄJÄN SYÖTTÖ ”vahvistat, että parametrit, jotka käyttäjä voi syöttää, vaihtelevat välillä 0 - ääretön, mutta" bash "tulkitsee vain välillä 0 - 9, koska 10 dollaria olisi yhtä suuri kuin 1 + 0.
Voit ratkaista tämän ongelman käyttämällä joko "shift" -komentoa nappaamaan seuraavat muuttujat. Tai määritä muuttuja aaltosulkeissa "$ {10}", jotta bash vie arvot yhteen, ei muodossa $ 1 + 0.
Ilman jatkoja, terveisiä!
Kiitos kommentistasi. Se ei täysin selittänyt poistumisen oikeaa käyttöä sekä komentosarjassa että toiminnoissa. Mitä tulee dollariin {10}, en ole koskaan testamentannut niin paljon, joten en ole törmännyt ongelmaan, on hyvä tietää, että siihen on olemassa ratkaisu (olen jo viettänyt tänään oppitun uuden asian 😀).
Paljon kiitoksia artikkelista! Joitakin mainitsemiasi asioita ei vielä selvitetty. Esimerkiksi getops.
Näytön ulostulojen osassa et maininnut kissaa, jonka mainitsit myöhemmin ...
kissa <
***************************************
* Tämä lomake on erittäin ilmeinen *
***************************************
EOF
Esimerkissäsi:
kissa << EOF >> test.sh
Kaksi asiaa tulisi mainita ... >> se on 'liitä' eli jos toistat saman komennon, sinulla on koko komentosarja kahtena kappaleena ... Käytä vain yhtä ...
kissa << EOF> script.sh
Kyllä, sitä tulisi kutsua myös script.sh
Sitten sisään
jos [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- apua"]]; sitten
auttaa
fi
Mielestäni se pitäisi kirjoittaa ...
jos [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- apua"]]; sitten
...
BASHista löytyy paljon muuta.
Voisitko antaa sille nimen "BASICS"? 🙂
Esimerkiksi parametri 'testaajat' kuten -z nähdäksesi, ovatko ne tyhjiä, tai -f nähdäksesi, onko se tiedostona.
Kiitos jälleen ponnisteluistasi.
alberto
Erittäin hyvä bash-skriptin opetusohjelma!
-KOODAUS: UTF-8 --
Se on ensimmäinen kerta, kun olen nähnyt kyseisen rivin asettamaan merkkikoodauksen bash-komentosarjaan. Se näyttää tyypillisemmältä Pythonilta kuin Bashilta. Onko se todella välttämätöntä? Olen etsinyt viittausta Googlesta, mutta en löydä mitään. Onko sinulla käsillä linkki, joka puhuu tästä asiasta? Erityisesti kyseisen linjan sopivuudesta.
Minun mielestäni kirjoittaaksesi komentosarjoja Bashiin UTF-8: lla, sinun on vain tallennettava tekstitiedosto sellaisenaan (ilman BOM: ää) ja sinulla on oltava tietyt ympäristömuuttujat (LANG ja LC_ *) oikein asetettuina.
Sitten on tietysti välttämätöntä, että suoritetut komennot valmistautuvat muihin koodauksiin kuin ASCII. Esimerkiksi, jos haluamme siirtyä isoihin kirjaimiin, tämä ei näytä toimivan:
«Kaiku áéíóú | tr az AZ »
o:
«Kaiku áéíóú | tr [: alempi:] [: ylempi:] »
ja on parempi käyttää:
«Kaiku áéíóú | awk '{print toupper ($ 0)}' ».
Tietoja «koodaus»On mainittu tässä blogissa aiemmin:
Bash: Kuinka tehdä komentosarja suoritettavaksi
Asennuksen jälkeinen apuohjelma
Joku korjaa minut, mutta tämä koodausrivi (# -KOODAUS: UTF-8 --) Sillä ei ole mitään tekemistä bashin tai kuoren kanssa: se on kommenttirivi (alkaa #) ja palvelee EDITORIA, että kirjoitamme komentosarjan (vim, emacs ...) tiedoston koodauksen.
Itse asiassa bash ei näe tällaista viivaa, koska se on kommenttirivi.
Erinomainen opetusohjelma, koska Sysadmin tietää komentosarjat Bashissa on välttämätöntä, se on hyödyllinen kaikkeen.
Erittäin hyvä!
Tervehdys!
Jos siitä on hyötyä kenellekään, tässä on useita käyttötapoja ja esimerkkejä omien komentosarjojen luomiseen: https://github.com/reduardo7/hsabx
Oikein hyvä. Uusia asioita lisätä skripteihini. Encodig- ja printf-jutulla ei ollut sitä.
Kiitos!!!
No niin hyvä artikkeli! Säilytän tämän suosikkeja varten. Olisi mukavaa korjata vika ja jopa laajentaa sitä enemmän sisällöllä. Suosionosoituksia kaikesta tästä tiedosta !!!!