Vakiotulo- ja lähtövirta.
Nämä ovat melko tärkeitä käsitteitä, jotka tarkoittavat yksinkertaisesti sitä, missä ohjelma lukee tietoja oletuksena (stdin) ja missä se tulostaa työnsä tulokset (stdout). Käytettävissä on myös vakiovirhetulostusvirta (stderr). Yleensä tämä on näyttö (tarkemmin sanottuna käyttäjän pääte) + näppäimistö. Miksi sinun täytyy tietää tämä? Ja tosiasia on, että kaikki nämä virrat voidaan ohjata uudelleen. Useimmiten tiedostoja käytetään syöttämiseen / ulostuloon.
Tällä tavalla voit esimerkiksi luoda tiedoston, joka sisältää luettelon tietyn hakemiston tiedostoista.
$ ls -l > ~/tiedosto_tiedostoilla
Muuten, on syytä muistaa, että seuraavassa suorituksessa tiedosto korvataan kokonaan ja kaikki, mikä oli aiemmin, menetetään. Jos haluat liittää tiedoston loppuun, sinun on käytettävä ">>" ">"
$ ls -l >> ~/tiedosto_tiedostoilla
Voit myös jakaa säikeitä komentoa suoritettaessa.
stdin on numero 0
stdout on numero 1
stderr on numero 2
Eli voit tulostaa virheet erilliseen tiedostoon ja tavallisia viestejä näytetään tavalliseen tapaan. Voit tehdä tämän asettamalla numeron 2 ennen ">" (virran numero, samoin stdin, stdout). Esimerkiksi näin
$ find / -name .bashrc 2> ~/finderrors.txt
Lisäksi on olemassa laite, kuten /dev/null, johon voit myös ohjata tulosteen. Tässä tapauksessa mitään ohjatuista ei näytetä missään.
$ find / -name asdf 2 > /dev/null
Tulos voidaan lähettää myös toiseen komentoon. Esimerkiksi seuraava komento tulostaa tiedoston sanojen määrän
$ cat ~/finderrors.txt > wc -w
Jos sinun on kirjoitettava komentosarja, johon jokin ohjelma vaatii syötteen, voit lähettää tiedoston sisällön siihen
$ wc -w< ~/finderrors.txt
Huomautus. ">" määrittämättä virran numeroa tulkitaan "1 >". Eli vain stdin tulostetaan.
Kuljettimet.
Olet varmaan nähnyt komennot seuraavanlaista:
$ cat /etc/bash.bashrc | lisää
Sen työn seurauksena lähtö keskeytyy, kun näyttö on täynnä. Joten "|" ja siellä on sama kuljetin. Taitavasti sanottuna tämä on putki, johon yksi prosessi voi vain kirjoittaa ja toinen vain lukea. Näytteenotto ja sijoittaminen tällaiseen putkilinjaan noudattaa FIFO-periaatetta (First In - First Out). Tätä periaatetta kutsutaan myös jonoksi, joka kuvaa hyvin yksinkertaisesti ja tarkasti sen työtä. Putkilinjoja käytetään useiden pienten ohjelmien työn yhdistämiseen.
Katsotaanpa seuraavaa komentoa.
$ cat myfile | grep Linux | me-1
Ensin cat myfile tulostaa tiedoston myfile sisällön, sitten grep Linux lukee tulosteen ja purkaa vain rivit, jotka sisältävät sanan Linux. Sitten wc -l laskee rivien määrän. Tuloksena saamme sanan Linux sisältävien rivien lukumäärän.
On erittäin kätevää käyttää xargs-apuohjelmaa yhdessä "|" kanssa. xargs lukee stdin:n tuloselementit välilyönneillä erotettuina ja suorittaa ohjelman välittäen ne sille yhden tai useamman kerran.
Esimerkiksi
$ find /tmp -name core -type f -print | xargs /bin/rm -f
Tämä komento löytää core-nimiset tiedostot /tmp-hakemistosta ja poistaa ne.
Erikoissymbolit.
Toisin kuin Windows, Linuxin tiedostonimet voivat sisältää melkein minkä tahansa merkin (esimerkiksi tiedostonimi esimerkki*:tiedosto on melko todellinen). Mutta bash käyttää joitain merkkejä palvelumerkkinä. Ja varten oikea toiminta nämä merkit on ohitettava. Tämä voidaan tehdä useilla tavoilla.
Voit laittaa lausekkeen lainausmerkkeihin. Esimerkiksi
$ cp "esimerkki*:tiedostosta" ~
Voit myös käyttää yksittäisiä lainausmerkkejä
$ cp "esimerkki*:tiedostosta" ~
Erona on se, että lainausmerkeissä kaikki erikoismerkit menettävät merkityksensä, kaksoislainausmerkeissä kaikki paitsi $ ja \
Mutta yleisin on C-tyyppinen tapa peruuttaa erikoismerkit. Tätä varten riittää, että laitat "\" merkin eteen (ilman lainausmerkkejä). Esimerkiksi komentomme näyttäisi tältä.
$ cp esimerkki\*of\:tiedosto ~
Komentojen suorittaminen.
Komentojen suorittamisen järjestämiseen on useita merkkejä.
Jos sinun on suoritettava useita komentoja peräkkäin, ne tulee erottaa symbolilla ";". Esimerkiksi, seuraava sekvenssi kääntää tiedoston (ja kääntäminen on pitkä prosessi, voit nukkua tällä hetkellä!), sammuta sitten tietokone.
$make; sudo sammutus -h nyt
Jos haluat ajaa ohjelman sisään tausta(eli palauta ohjaus käyttäjälle heti käynnistämisen jälkeen, tämä voi olla kätevää graafisia sovelluksia käynnistettäessä), sitten on tarpeen laittaa "&"-symboli komennon jälkeen. Esimerkiksi
$ sudo synaptic &
Tämän seurauksena käynnistämme synapticin ja on mahdollista käyttää nykyistä pääteemulaattoria poistumatta siitä.
Mutta entä jos meidän on suoritettava komento vain, jos toiminto on suoritettu onnistuneesti. Siellä on esimerkiksi seuraava tehtävä:
Sinun on koottava tiedosto. Tätä varten sinun on suoritettava configure, make, sudo make install. Lisäksi sinun on suoritettava vain, jos edellinen komento päättyi onnistuneesti.
Tällaisissa tapauksissa käytetään "&&"-sekvenssiä. "&&":n jälkeinen lauseke suoritetaan vain, jos edellinen on suoritettu onnistuneesti. Eli se näyttää tältä:
$ ./configure && tee && sudo make install
Jos sinun on suoritettava vain, jos ohjelma päättyy virheeseen, sinun on käytettävä "||". Monimutkaistaan esimerkiksi tehtävää. Se on kirjoitettava tiedostoon virheen sattuessa ja sammuta sitten tietokone lopusta riippumatta.
$ ./configure && tee && tee asennus || echo fail > ~/errorfile ; sudo sammutus -h nyt
Tiedostonimien mallit
Helpoin on listata ne pöydälle. On syytä muistaa, että mallit voidaan yhdistää yhdeksi komennosta.
Kuvion merkitys
* Mikä tahansa merkkijono, myös tyhjä
? Mikä tahansa yksittäinen merkki
(a,b,c,d) Mikä tahansa suluissa luetelluista merkeistä
Mikä tahansa merkki määritetyistä aikaväleistä
[^0-6] Mikä tahansa merkki, joka ei ole määritettyjen välien sisällä
Helpoin tapa ymmärtää ne on esimerkin avulla.
Oletetaan, että meillä on kansio, joka sisältää seuraavat tiedostot.
Glava01, Glava02, Glava03, Glava04, Glava05, Glava15, Glava17.
Käytä mallia Glava0* ja hanki luettelo Glava01, Glava02, Glava03, Glava04, Glava05.
Käytetään mallia Glava?5 ja saadaan lista Glava05, Glava15.
Käytetään mallia Glava?(4,5) ja saadaan lista Glava04, Glava05, Glava15.
Otetaan käyttöön Glava0-malli ja hankitaan luettelo Glava01, Glava02, Glava03.
Aritmeettisten lausekkeiden suoritus.
Kyllä, bash voi myös tehdä sen. Tätä varten on kaksi muotoa.
ensimmäinen $[lauseke]
toinen $((lauseke))
Esimerkiksi
$ kaiku $
Suorituksen seurauksena näyttöön tulee numero 6. Jos lauseke on virheellinen, bash antaa virheilmoituksen.
Komennon korvaaminen.
Komentokorvaus on hyvin voimakas työkalu lyödä. Asia on siinä, että tallennettu komento muuttuu suorituksensa tulokseksi. On olemassa kaksi kirjoitusmuotoa
$(komento) ja `komento` (tässä tapauksessa ei käytetä yksittäisiä lainausmerkkejä, vaan SHIFT + ~ -yhdistelmästä johtuvia merkkejä). Esimerkiksi täällä loistava esimerkki, jota Debian käyttää asentaessaan nykyisiä ytimen otsikkopaketteja.
# apt-get install linux-headers-`uname -r`
Uname -r-komento, kun se suoritetaan, tulostaa käytetyn ytimen version. Eli kun suoritan sen, se muuttuu muotoon
# apt-get install linux-headers-2.6.25-2-686
Lisäksi se voi saada sinulle erilaisen ilmeen. Voit myös vaihtaa ytimen ja asentaa paketteja samalla komennolla.
Suodattimet
Nämä ovat komentoja, jotka voivat muuttaa syötetyn datavirran ja tulostaa tuloksen vakiolähtövirtaan.
Komento Lyhyt kuvaus
cat Vakiolähtöön (esim.
näytöllä) näyttää määritetyn tiedoston (tai useiden tiedostojen) sisällön.
saaliit, jos niiden nimet on määritetty peräkkäin komentoargumentteina).
grep, fgrep, egrep Hae sisään syöttötiedosto tai dataa vakiotulo määritetyn kuvion sisältävät rivit ja tulosta ne vakiotulostukseen
tr Korvaa syöttövirrassa kaikki annetussa luettelossa lueteltujen merkkien esiintymät toisen tietyn luettelon vastaavilla merkeillä
comm Vertaa kahta tiedostoa rivi riviltä ja tulostaa 3 saraketta stdoutiin: ensimmäinen sisältää rivejä, jotka esiintyvät vain tiedostossa 1, toinen sisältää rivejä, jotka esiintyvät vain tiedostossa 2 ja kolmas sisältää rivejä, jotka esiintyvät tiedostossa 2. molemmat tiedostot
pr Tulostusmuodot tekstitiedosto tai vakiosyötteen sisältö
sed Rivieditori, jota käytetään suorittamaan jonkin muunnos syöttövirralle (otettu tiedostosta tai vakiosyötteestä)
enemmän ja vähemmän Näytä tiedoston sisältö näytöllä erillisillä sivuilla, jotka ovat koko näytön kokoisia.
wc Laskee virran sanojen, rivien tai tavujen määrän.
Esimerkiksi,
$ grep CONFIG_XEN . -RL | xargs -i sed -i -e "s/CONFIG_XEN/CONFIG_LUPO/g" ()
Etsitään tiedostoja nykyinen kansio sisältää merkkijonon "CONFIG_XEN" ja muuttaa sen muotoon "CONFIG_LUPO" kaikissa löydetyissä tiedostoissa.
Tässä pidämme tauon ymmärtääksemme koko materiaalin määrän. Bash on erittäin tehokas tulkki, ja sen hallitseminen vaatii harjoittelua. Seuraavassa artikkelissa tarkastellaan skriptien luomista sille. Aloitetaan ohjelmointi. Nähdään ensi kerralla!
Tunnisteet: linux, artikkelit
Tunnisteet: Miksi tarvitset komentoputken bashissa
Kun työskentelet tiimissä, ruokittelet toisiasi tunteilla, työlläsi, onnistumisillasi ja saavutuksilla....
Joukkueet /tulostaulu joukkueet lisää nimi /tulostaulu joukkueet lista /tulostaulu joukkueet liittyä nimi /tulostaulu joukkueet poistuvat ...
google.com/bin/echo foo | grep bar" .... getpid() = 13726<– PID ..... 1 · Почему в Ubuntu 16.04 медленный apt-get dist-upgrade? ... Спасибо, очень интересная статься… но как всегда нужна мера, чтобы не полочалось такого:
25. helmikuuta 2009 - tee komennot tehty. Katsotaanpa pientä esimerkkiä: #!/bin/bash .... Liukuhihna on erittäin tehokas työkalu Bash-konsolin kanssa työskentelyyn. .... tehdä jotain ja yrittää selvittää, miksi tehtävät ohjelmat -hakemistoa ei löytynyt... ... Ehkä se vaatii asetuksia, mutta minulla on vielä...
Auta minua ratkaisemaan joitain ongelmia. #!/bin/bash | Aiheen kirjoittaja: Ilja
30. Luo liukuhihna, jossa luetellaan vain työhakemistossasi olevien tiedostojen nimet ja käyttöoikeudet. 31. Muokkaa rakennettua liukuhihnaa niin, että luettelo tallennetaan HOME-hakemistosi spisok-tiedostoon ja vain luettelossa olevien tiedostojen määrä näkyy näytöllä. 32. Näytä /etc/passwd-tiedoston sisältö käyttäjänimikentän mukaan lajiteltuna. 33. Luo kirjautuneen alias, joka näyttää aakkosjärjestyksessä luettelon järjestelmään kirjautuneiden käyttäjien nimistä. 34. Anna IAM-muuttuja rekisteröintinimesi. Aloita toinen kuori. Näetkö tämän muuttujan? Mitä pitää tehdä, jotta se näkyy luodussa kuoressa? Muuta IAM-muuttujan arvoa luodussa komentotulkassa. Poistu syntyneestä kuoresta. Etsi tämän muuttujan arvo alkuperäisestä kuoresta. Selitä tulos. 40. Kirjoita hello shell -ohjelma, joka antaa seuraavan vastauksen komentoriviargumenteille: - "-d" argumentti - ohjelma suorittaa päivämääräkomennon; - argumentti "-l" - ohjelma näyttää nykyisen hakemiston sisällön; jos komentorivillä ei ole argumentteja tai virheellisiä argumentteja, ohjelma näyttää ohjeita sen valinnoista. 41. Kirjoita ohjelma nimeltä sanat, joka kehottaa käyttäjää syöttämään sanan kerrallaan, kunnes hän kirjoittaa sanan "end". Muista kaikki syötetyt sanat. Kun olet kirjoittanut sanan "end", näytä kaikki syötetyt sanat näytöllä. Kiitos, jos voit ehdottaa ainakin yhtä näistä.
Vitaly 32.cat /etc/passwd | järjestellä
Advanced Bash-Scripting Guide - Linux
Miksi Shell-kieltä pitää osata? 2. ..... Lähdön liukuhihna echo-komennosta lukukomentoon; 33-1. kääre käsikirjoitus; 33-2. Lisää...
I/O-uudelleenohjaus - OpenNet
Advanced Bash-Scripting Guide: The Art of Language Programming... Yksiriviset uudelleenohjauskomennot # (vaikuttavat vain riviin... Vain stderr välitetään liukuhihnalle. exec 3>&1 # Tallenna virta...
For-in-operaattori on suunniteltu pääsemään luettelossa lueteltuihin arvoihin yksitellen. Jokainen arvo vuorotellen luettelossa on määritetty muuttujaan. Syntaksi on seuraava:
arvo_listan muuttujalle tee komennot tehtyHarkitse pientä esimerkkiä:
#!/bin/bash for i in 0 1 2 3 4 #muuttujalle $i annetaan arvot 0-4 mukaan lukien do echo "Konsolin numero on $i">> /dev/pts/$i #Kirjoita tiedostoon /dev/pts/$i (virtuaalipäätetiedosto) rivi "Konsolin numero on $i" valmis #sykli päättyi poistu 0Esimerkin suorittamisen jälkeen viiteen ensimmäiseen virtuaalikonsoliin (päätteeseen) ilmestyy rivi sen numerolla. Arvot luettelosta ja silmukasta korvataan vuorotellen $i-muuttujalla Työn alla tämän muuttujan arvon kanssa.
syklit. kun silmukka
While-silmukka on monimutkaisempi kuin for-in-silmukka, ja sitä käytetään toistamaan komentoja, kun jokin lauseke on tosi (paluukoodi = 0). Operaattorin syntaksi on seuraava:
kun lauseke tai komento palauttaa done-komennon do paluukoodinEsimerkki silmukan toiminnasta näkyy seuraavassa esimerkissä:
#!/bin/bash taas = kyllä #määritä muuttujalle uudelleen arvo "kyllä". sillä aikaa[" $taas"= "kyllä"] #Käymme silmukalla, kunnes $jälleen on yhtä suuri kuin "kyllä" do echo "Syötä nimi:" lue nimi kaiku "Antamasi nimi on $nimi" echo "Haluatko jatkaa?" lue uudelleen tehty echo "Bye-Bye"Ja nyt käsikirjoituksen tulos:
[sähköposti suojattu]:~$ ./bash2_primer1.sh Anna nimi: ite Antamasi nimi on ite Haluatko jatkaa? kyllä Anna nimi: mihail Antamasi nimi on mihail Haluatko jatkaa? ei hei hei
Kuten näet, silmukka suoritetaan, kunnes annamme jotain muuta kuin "kyllä". Do- ja done-välillä voit kuvata mitä tahansa rakenteita, lauseita jne., ne suoritetaan kaikki silmukassa. Mutta sinun tulee olla varovainen tämän silmukan kanssa, jos suoritat siinä jonkin komennon muuttamatta lausekemuuttujaa, voit saada loputtomaan kierteeseen.
Nyt totuusehtoon. Jonkin ajan kuluttua, kuten if-then-else ehtolauseessa, voit lisätä minkä tahansa lausekkeen tai komennon, joka palauttaa paluukoodin, ja silmukka suoritetaan niin kauan kuin paluukoodi = 0! "["-operaattori on testikomennon analogi, joka tarkistaa sille välitetyn ehdon totuuden.
Katsotaanpa toista esimerkkiä, otin sen kirjasta Advanced Bash scripting. Pidin todella hänestä Smilesta, mutta yksinkertaistin sitä hieman. Tässä esimerkissä esittelemme toisen tyyppisen UNTIL-DO-silmukan. Tämä käytännössä täydellinen analogi WHILE-DO -silmukka, suoritetaan vain, kun jokin lauseke on epätosi.
Tässä on esimerkki:
#!/bin/bash echo "Syötä osoittaja:" lue osinko kaiku "Anna nimittäjä:" lue jakaja dnd =$osinko #muutamme muuttujia osinko ja jakaja, #tallentaa tietonsa muihin muuttujiin, koska he antavat meille#will need dvs =$jakojäännös =1 asti [ " $jäännös"-eq 0 ] anna "jäännös = osinko % jakaja" dividend =$jakaja jakaja =$jäännös tehty echo "gcd of numbers $dnd ja $dvs = $osinko"Skriptin suorituksen tulos:
[sähköposti suojattu]:~$ ./bash2_primer3.sh Syötä osoittaja: 100 Syötä nimittäjä: 90 GCD numeroista 100 ja 90 = 10
Matemaattiset operaatiot
anna komentaa.
anna komento tuottaa aritmeettiset operaatiot lukujen ja muuttujien yli.
Harkitse pientä esimerkkiä, jossa suoritamme laskutoimituksia syötetyille numeroille:
#!/bin/bash echo "Tyyppi a: " lue kaiku "Tyyppi b: " lue b anna "c = a + b" #addition echo "a+b= $ c " olkoon "c = a / b" #jakaa kaiku "a/b= $ c " anna "c<<= 2" #shifts c 2 bittiä vasemmalle kaiku "c 2 bitin siirron jälkeen: $c" olkoon "c = a % b" # löytää jakojäännöksen a:lla b:llä kaiku" $a / $b. loput: $c "Toteutuksen tulos:
[sähköposti suojattu]:~$ ./bash2_primer2.sh Syötä a: 123 Syötä b: 12 a+b= 135 a/b= 10 s 2-numeroisen siirron jälkeen: 40 123 / 12. loppuosa: 3
No, kuten näet, ei mitään monimutkaista, matemaattisten operaatioiden luettelo on vakio:
Lisäys
- - vähennyslasku
* - kertolasku
/ - jako
** - eksponentiointi
% - modulo(modulo-jako), jaon loppuosa
Let antaa sinun käyttää aritmeettisten komentojen lyhenteitä, mikä vähentää käytettävien muuttujien määrää.
Esimerkiksi: a = a+b vastaa a +=b jne.
Työskentely ulkoisten ohjelmien kanssa komentosarjoja kirjoitettaessa
Aloitetaan hyödyllisellä teorialla.
Suoratoiston uudelleenohjaus
Bashissa (kuten monissa muissakin komentotulkeissa) on sisäänrakennetut tiedostokuvaajat: 0 (stdin), 1 (stdout), 2 (stderr).
stdout - Vakiolähtö. Kaikki, mitä ohjelmat tuottavat, menee tänne.
stdin - Vakiotulo. Tämä on kaikki, mitä käyttäjä kirjoittaa konsoliin
stderr - Normaali virhetulostus.
Näillä kuvaajilla toimiville toiminnoille on erikoismerkkejä: > (ulostulon uudelleenohjaus),< (перенаправление ввода). Оперировать ими не сложно. Например:
cat /dev/random > /dev/nullohjaa cat /dev/random tulos hakemistoon /dev/null (täysin hyödytön toiminto) tai
ls -la > listauskirjoittaa nykyisen hakemiston sisältö listaustiedostoon (jo hyödyllisempi)
Jos tiedostoon on lisättävä (käytettäessä ">" se korvataan), on käytettävä ">>" ">"
sudo< my_passwordkun sudoa on pyydetty antamaan salasana, se otetaan my_password-tiedostosta aivan kuin olisit kirjoittanut sen näppäimistöltä.
Jos tiedostoon on kirjoitettava vain virheet, jotka ovat saattaneet tapahtua ohjelman toiminnan aikana, voit käyttää:
./ ohjelma_virheellä 2 > virhetiedostonumero 2 ennen ">" tarkoittaa, että sinun on ohjattava uudelleen kaikki, mikä kuuluu kuvaajaan 2 (stderr).
Jos stderr on pakotettava kirjoittamaan stdoutiin, tämä voidaan tehdä seuraavasti. tapa:
./ ohjelma_virheellä 2 >& 1merkki "&" tarkoittaa osoitinta kuvaajaan 1 (stdout)
(Oletusarvoisesti stderr kirjoittaa konsoliin, jossa käyttäjä työskentelee (tai pikemminkin kirjoittaa näyttöön)).
2. Kuljettimet
Liukuputki on erittäin tehokas työkalu Bash-konsolin kanssa työskentelyyn. Syntaksi on yksinkertainen:
joukkue1 | komento 2 - tarkoittaa, että komennon 1 lähtö välitetään komennon 2 tuloon
Liukulinjat voidaan ryhmitellä ketjuihin ja tulostaa uudelleenohjaamalla tiedostoon, esimerkiksi:
ls -la | grep "hash" | lajittele > sortilg_listKomennon ls -la tulos johdetaan grep-komentoon, joka valitsee kaikki rivit, jotka sisältävät sanan hash, ja pipetoidaan sort-komentoon, joka kirjoittaa tuloksen tiedostoon lajitteluluettelo. Kaikki on melko selkeää ja yksinkertaista.
Useimmiten Bash-skriptejä käytetään joidenkin konsolin rutiinitoimintojen automatisoimiseksi, joten joskus on tarpeen käsitellä yhden komennon stdout ja siirtää se stdiniin toiseen komentoon, kun taas yhden komennon suorittamisen tulos on käsiteltävä jollain tavalla. Tässä osiossa yritän selittää perusperiaatteet, jotka koskevat työskentelyä komentosarjan sisällä olevien ulkoisten komentojen kanssa. Mielestäni olen antanut tarpeeksi esimerkkejä ja nyt voin kirjoittaa vain pääkohdat.
1. Lähdön välittäminen muuttujalle
Jotta komennon tulos kirjoitetaan muuttujaan, riittää, että laitat komennon lainausmerkkeihin, esim.
A = ` echo "qwerty" ` echo $a
Työn tulos: qwerty
Jos kuitenkin haluat kirjoittaa hakemistoluettelon muuttujaan, sinun on prosessoitava tulos oikein, jotta tiedot voidaan laittaa muuttujaan. Tarkastellaanpa pientä esimerkkiä:
LIST =` find / svn/ -type d 2>/ dev/ null| awk "(FS="/") (tulosta 4 dollaria)" | lajitella | ainutlaatuinen | tr "\n" " " ` ONE_OF_LIST luettelossa $LIST do svnadmin hotcopy / svn/ $ONE_OF_LIST / svn/ temp4backup/ $ONE_OF_LIST valmisTäällä käytämme silmukalle-do-done arkistoidaksesi kaikki /svn/-kansion hakemistot svnadmin hotcopy -komennolla (millä meidän tapauksessamme ei ole kenellekään merkitystä, vain esimerkkinä). Mielenkiintoisin rivi on: LIST=`find /svn/ -type d 2>/dev/null| awk "(FS="/") (tulosta $4)"| lajittele|ainutlaatuinen| tr "\n" " "` Siinä LIST-muuttujalle on määritetty awk-, sort-, uniq-, tr-komennoilla käsitellyn find-komennon suorittaminen (emme käsittele kaikkia näitä komentoja, koska tämä on erillinen artikkeli). LIST-muuttuja sisältää kaikkien /svn/-kansiossa olevien hakemistojen nimet yhdelle riville (silmukan tyhjentämiseksi.
Kuten näet, kaikki ei ole vaikeaa, riittää, että ymmärrät periaatteen ja kirjoitat pari omaa käsikirjoitustasi. Lopuksi haluan toivottaa sinulle onnea BASHin ja Linuxin oppimiseen yleensä. Kritiikki, kuten tavallista, on tervetullutta. Seuraava artikkeli on todennäköisesti omistettu ohjelmien, kuten sed, awk, käyttöön.
Mitä tarvitaan?
Sinun on tunnettava komentorivi sekä ohjelmoinnin peruskäsitteet. Vaikka tämä ei ole ohjelmointioppikirja, se selittää (tai sen mukaan vähintään, yritetään selittää) monia peruskäsitteitä.
Tämän asiakirjan käyttö
Tätä asiakirjaa voidaan tarvita seuraavissa tilanteissa:
Sinulla on ohjelmointiideoita ja sinun on koodattava joitain shell-skriptejä.
Ohjelmointiideasi eivät ole tarpeeksi tarkkoja ja vaativat lisäopastusta.
Haluat tarkastella joitain shell-skriptejä ja kommentteja mallina luodessasi omia.
Olet siirtymässä DOS:sta/Windowsista (tai olet jo tehnyt niin) ja haluat luoda erätiedostoja ("erä").
Olet täydellinen nörtti ja luet kaikki käsillä olevat ohjeet.
Yksinkertaisimmat skriptit
Tämä OHJE yrittää antaa sinulle ohjeita shell-ohjelmointiin perustuen vain esimerkkeihin.
Tästä osiosta löydät pieniä skriptejä, joista on todennäköisesti hyötyä joidenkin temppujen hallitsemisessa.
Perinteinen "hello world" -käsikirjoitus
#!/bin/bash echo Hei maailma!
Tämä kirjoitus sisältää vain kaksi riviä. Ensimmäinen kertoo järjestelmälle, mitä ohjelmaa käytetään tiedoston suorittamiseen.
Toinen rivi on ainoa tämän skriptin suorittama toiminto, joka tulostaa terminaaliin "Hei maailma".
Jos saat jotain, kuten ./hello.sh: Komentoa ei löydy. , niin ehkä ensimmäinen rivi "#!/bin/bash" on väärä; suorita whereis bash tai etsi bash selvittääksesi, mikä rivin pitäisi olla.
Yksinkertainen varmuuskopiointi
#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/
Tässä komentosarjassa luomme käyttäjän kotihakemiston tarballin sen sijaan, että tulostaisimme viestin päätelaitteelle. Käsikirjoitusta EI ole tarkoitettu käytännön käyttöön. Tehokkaampi käsikirjoitus esitetään myöhemmin tässä asiakirjassa. Varakopio.
Kaikki uudelleenohjausteoriasta ja pikanäkymästä
Tiedoston kuvauksia on kolme: stdin on vakiotulo, stdout on vakiotulos ja stderr on vakiovirhe.
Tärkeimmät ominaisuudet:
uudelleenohjaa stdout tiedostoon
uudelleenohjaa stderr tiedostoon
uudelleenohjaa stdout osoitteeseen stderr
uudelleenohjaa stderr stdoutiin
uudelleenohjaa stderr ja stdout tiedostoon
uudelleenohjaa stderr ja stdout stdoutiin
uudelleenohjaa stderr ja stdout stderr:iin
1 tarkoittaa stdout ja 2 tarkoittaa stderr. Pieni huomautus syvempään ymmärtämiseen: Vähemmän komennolla voit tarkastella sekä puskuriin jäävää stdout-tiedostoa että näytölle tulostettua stderr-tiedostoa. Se kuitenkin poistuu, kun yrität "katsoa" puskurin läpi.
Esimerkki: stdout tiedostoon
Tämä toiminto kirjoittaa ohjelman vakiotulosteen tiedostoon.
ls -l > ls-l.txt
Tämä luo tiedoston nimeltä "ls-l.txt". Se sisältää kaiken, mitä näkisit, jos käyttäisit vain "ls -l". 3.3 Esimerkki: stderr tiedostoon
Tämä toiminto kirjoittaa ohjelman vakiovirhevirran tiedostoon.
grep da * 2> grep-errors.txt
Tämä luo tiedoston nimeltä "grep-errors.txt". Se sisältää standardin virheosan "grep;da;*"-komennon lähdöstä. 3.4 Esimerkki: stdout to stderr
Tämä toiminto kirjoittaa ohjelman vakiotulosteen samaan tiedostoon kuin vakiovirhevirta.
grep da * 1>&2
Tässä komennon vakiolähtö lähetetään vakiovirheeseen. Voit nähdä sen monella tapaa. 3.5 Esimerkki: stderr 2 stdout
Tämä toiminto kirjoittaa ohjelman vakiovirheen samaan paikkaan kuin vakiotuloste.
grep*2>&1
Tässä komennon vakiovirhe lähetetään vakiolähtöön; jos putsaat tuloksen (|) pienemmäksi, huomaat, että rivit, jotka normaalisti häviävät (jotka kirjoitetaan vakiovirheeseen), säilyvät tässä tapauksessa (koska ne ovat vakiotulostuksessa). 3.6 Esimerkki: stderr ja stdout tiedostoon
Tämä toiminto siirtää kaikki ohjelman tulosteet tiedostoon. Tämä on hyvä vaihtoehto cron-töille: jos haluat komennon ajavan täysin näkymättömästi.
rm -f $(etsi / -name ydin) &> /dev/null
Tämä (oletetaan cronille) poistaa minkä tahansa "core"-nimisen tiedoston mistä tahansa hakemistosta. Muista, että sinun on oltava täysin varma siitä, mitä komento tekee, jos haluat korvata sen tulosteen. 4. Kuljettimet
Tässä osiossa selitetään melko yksinkertaisesti ja käytännöllisesti, kuinka putkia käytetään ja miksi saatat tarvita niitä.
Mikä se on ja miksi sitä pitäisi käyttää?
Liukulinjat antavat sinulle mahdollisuuden käyttää (se on varmasti tarpeeksi helppoa) yhden ohjelman tulosta toisen ohjelman tulona.
Esimerkki: yksinkertainen putki, jossa on sed
Tämä on hyvin yksinkertainen tapa käyttää putkia.
ls -l | sed -e "s//u/g"
Tässä tapahtuu, että ls;-l-komento suoritetaan aluksi ja sen tulos sen sijaan, että se näkyisi näytöllä, lähetetään sed-ohjelmalle, joka puolestaan tulostaa sen, mitä sen pitäisi. 4.3 Esimerkki: vaihtoehto ls;-l;*.txt:lle
Tämä on ehkä paljon monimutkaisempi tapa kuin ls;-l;*.txt, mutta se on sisällytetty tähän vain havainnollistamaan liukuhihnan toimintaa, ei valittamaan näiden kahden listaustavan välillä.
ls -l | grep "\.txt$"
Tässä ls -l -ohjelman tulos lähetetään grep-ohjelmalle, joka puolestaan tulostaa säännöllistä lauseketta "\.txt$" vastaavat rivit näytölle. 5. Muuttujat
Voit käyttää muuttujia samalla tavalla kuin millä tahansa ohjelmointikielellä. Tietotyyppejä ei ole. Bashin muuttuja voi olla numero, merkki tai merkkijono.
Sinun ei pitäisi ilmoittaa muuttujaa. Itse asiassa arvon määrittäminen sen osoittimelle luo sen jo.
Esimerkki: "Hei maailma!" käyttämällä muuttujia
#!/bin/bash
STR="Hei maailma!"
echo $STR
Toinen rivi luo muuttujan nimeltä STR ja antaa sille merkkijonoarvon "Hello World!". Tämän muuttujan ARVO haetaan sitten lisäämällä "$"-merkki alkuun. Muista (yritä), että jos et käytä "$" -merkkiä, ohjelman tulos voi olla erilainen. Ei luultavasti se jota haluat.
Esimerkki: hyvin yksinkertainen varmuuskopioskripti (tehokkaampi)
#!/bin/bash
OF=/var/my-backup-$(päivämäärä +%Y%m%d).tgz #OF - Tulostiedosto - tulostiedosto
tar -cZf $OF /koti/minä/
Tämä käsikirjoitus esittelee toisen käsitteen. Ensinnäkin sinun pitäisi käsitellä toista riviä. Kiinnitä huomiota lausekkeeseen "$(päivämäärä +%Y%m%d)". Jos suoritat tämän skriptin, huomaat, että se suorittaa suluissa olevan komennon ja saa sen tulosteen.
Huomaa, että tässä komentosarjassa tulostiedoston nimi muuttuu päivittäin Date;(+%Y%m%d)-komennon avaimen muodon mukaan. Voit muuttaa tätä eri muototehtävällä.
Muita esimerkkejä:
echo ls
kaiku $(ls)
Paikalliset muuttujat
Paikallisia muuttujia voidaan luoda käyttämällä paikallista avainsanaa.
#!/bin/bash
HELLO=Hei
toiminto hei (
local HELLO=Maailma
echo $HELLO
}
echo $HELLO
Hei
echo $HELLO
Tämän esimerkin pitäisi riittää osoittamaan, kuinka paikallisia muuttujia voidaan käyttää.
Ehdolliset lausunnot
Ehdolliset lausunnot antavat sinun päättää, suoritatko toiminnon vai et; päätös tehdään, kun lausekkeen arvo on arvioitu.
Pelkkää teoriaa
Ehdollisia lauseita on monia muotoja. Perusmuoto on if-lauseke then-lause, jossa "lauseke" suoritetaan vain, jos "lauseke" evaluoituu tosi. "2<1" - это выражение, имеющее значение "ложь", в то время как "2>1" - "tosi".
Ehdollisia lausekkeita on muitakin muotoja, kuten: if lauseke sitten lauseke1 else lauseke2. Tässä "lauseke1" suoritetaan, jos "lauseke" on tosi; muussa tapauksessa "lauseke2" suoritetaan.
Toinen ehdollisten lausekkeiden muoto on: if lauseke1 sitten lauseke1 else if lauseke2 sitten lauseke2 else lauseke3. Tässä muodossa vain sekvenssi "MUUT, JOS "lauseke2" NIIN "lauseke2" lisätään, jolloin "lauseke2" suoritetaan, jos "lauseke2" arvioi arvoon tosi. Kaikki muu vastaa käsitystäsi tästä (katso aiemmat lomakkeet).
Muutama sana syntaksista:
Bashin "if"-lauseen perusrakenne on seuraava:
jos [lauseke];
sitten
koodi, jos "lauseke" on tosi.
fi
Esimerkki: perusesimerkki ehtolausekkeesta if;..;hen
#!/bin/bash
if [ "foo" = "foo" ]; sitten
fi
Jos hakasulkeissa oleva lauseke on tosi, suoritettava koodi on sanan "then" jälkeen ja ennen sanaa "fi", joka tarkoittaa suoritettavan koodin loppua ehdon täyttyessä.
Esimerkki: alkeisesimerkki ehtolausekkeesta if;..;then;...;else
#!/bin/bash
if [ "foo" = "foo" ]; sitten
kaikulauseke arvostuu tosi
muu
fi
Esimerkki: ehdolliset lauseet muuttujilla
#!/bin/bash
T1="foo"
T2="palkki"
jos [ "$T1" = "$T2" ]; sitten
kaikulauseke arvostuu tosi
muu
kaikulauseke arvostuu epätosi
fi
for, while ja till silmukoita
Tässä osiossa opit for-, while- ja till-silmukoista.
For-silmukka eroaa hieman muiden ohjelmointikielien vastineistaan. Ensinnäkin se antaa sinulle mahdollisuuden suorittaa peräkkäisiä toimintoja merkkijonon "sanoille".
While-silmukka suorittaa koodinpätkän, jos testattava lauseke on tosi; ja pysähtyy, jos se on epätosi (tai suoritettavan koodin sisällä havaitaan eksplisiittinen silmukan katkeaminen).
till-silmukka on lähes identtinen while-silmukan kanssa. Ainoa ero on, että koodi suoritetaan, jos tarkistettava lauseke on epätosi.
Jos oletat, että aika ja kunnes ovat hyvin samankaltaisia, olet oikeassa.
esimerkiksi silmukka
#!/bin/bash
for i in $(ls); tehdä
kaikukohde: $i
tehty
Toisella rivillä edustamme i:tä muuttujana, joka vastaanottaa $(;ls;) sisältämät erilaiset arvot.
Tarvittaessa kolmas rivi voisi olla pidempi; tai voi olla useita rivejä ennen tehtyä (4. rivi).
"done" (4. rivi) osoittaa, että koodi, joka käyttää $i:n arvoa, päättyy ja $i saa uuden arvon.
Tämä kirjoitus ei ota suurta merkitystä. Hyödyllisempi for-silmukan käyttö olisi käyttää sitä vain tiettyjen tiedostojen valitsemiseen edellisessä esimerkissä.
C-tyyppinen
fiesh ehdotti tämän muodon silmukan lisäämistä. Tämä on for-silmukka, joka muistuttaa eniten C:ssä, Perlissä ja vastaavissa.
#!/bin/bash
i:lle jaksossa 1 10;
tehdä
echo $i
tehty
Esimerkki while-silmukasta:
#!/bin/bash
LASKURI=0
kun taas [ $LASKURI -lt 10 ]; tehdä
echo Laskuri on $COUNTER
anna COUNTER=LASKURI+1
tehty
Tämä skripti "emuloi" hyvin tunnettua (C:ssä, Pascalissa, perlissä jne.) "for"-rakennetta.
Esimerkki silmukasta asti:
#!/bin/bash
LASKURI=20
asti [ $LASKURI -lt 10 ]; tehdä
echo COUNTER $LASKURI
anna COUNTER-=1
tehty
Toiminnot
Kuten minkä tahansa muun ohjelmointikielen, voit käyttää funktioita koodin osien ryhmittelyyn loogisemmalla tavalla sekä rekursion maagisen taiteen harjoittamiseen.
Funktioilmoitus on vain funktio my_func ( my_code ) -merkintä.
Toiminnon kutsuminen tapahtuu samalla tavalla kuin muiden ohjelmien kutsuminen. Kirjoitat vain hänen nimensä.
Toimintoesimerkki
#!/bin/bash
funktio quit(
poistu
}
toiminto hei (
echo Hei!
}
Hei
lopettaa
kaiku foo
Rivit 2-4 sisältävät "quit"-toiminnon. Rivit 5-7 ovat "hei"-toiminto. Jos et ymmärrä tämän skriptin suorittamaa prosessia, kokeile sitä!
On huomattava, että toimintoja ei tarvitse ilmoittaa missään tietyssä järjestyksessä.
Jos suoritat komentosarjan, huomaa, että ensin kutsutaan "hello"-funktio ja sitten "quit"-funktio. Mitä tulee ohjelmaan, se ei koskaan saavuta 10. riviä.
Esimerkki funktioista parametreilla
#!/bin/bash
funktio quit(
poistu
}
funktio e (
kaiku $1
}
e Hei
e Maailma
lopettaa
kaiku foo
Tämä kirjoitus on lähes identtinen edellisen kanssa. Suurin ero on "e"-funktio. Se tulostaa ensimmäisen vastaanottamansa argumentin. Funktioiden argumentit käsitellään samalla tavalla kuin komentosarjalle välitetyt argumentit.
Käyttöliittymät
Valitsemalla voit luoda yksinkertaisia valikkoja
#!/bin/bash
OPTIONS="Hei, lopeta"
valitse opt in $OPTIONS; tehdä
if [ "$opt" = "Lopeta" ]; sitten
kaiku tehty
poistu
elif[ "$opt" = "Hei" ]; sitten
echo hei maailma
muu
asia selvä
echo huono vaihtoehto
fi
tehty
Jos suoritat tämän skriptin, näet, että se on ohjelmoijan unelma tekstipohjaisesta valikosta. Huomaat luultavasti, että tämä on hyvin samanlainen kuin "for"-konstruktio, mutta sen sijaan, että se kierrettäisiin jokaisen "sanan" läpi $OPTIONSissa, ohjelma pyytää käyttäjää.
Komentorivin käyttäminen
#!/bin/bash
jos [ -z "$1"]; sitten
kaiun käyttö: $0 hakemisto
poistu
fi
SRCD=$1 #SRCD - Lähdehakemisto - lähdehakemisto
tar -cZf $TGTD$OF $SRCD
Sinun pitäisi pystyä ymmärtämään, mitä tämä kirjoitus tekee. Ensimmäisen ehdollisen lauseen lauseke testaa, vastaanottiko ohjelma argumentin ($1). Jos ei, se lopettaa ohjelman ja näyttää käyttäjälle pienen virheilmoituksen. Käsikirjoituksen loppuosa on toistaiseksi itsestään selvä.
Sekalaista
Käyttäjän syötteen lukeminen ja lukeminen
Joissakin tapauksissa voi olla tarpeen pyytää käyttäjää syöttämään jotain. On olemassa erilaisia tapoja saavuttaa tämä. Yksi tapa on seuraava:
#!/bin/bash
echo Kirjoita nimesi
lue NAME
echo "Hei $NAME!"
Vaihtoehtoisesti voit saada useita arvoja kerralla lukemalla. Seuraava esimerkki selventää asiaa:
#!/bin/bash
echo "Anna etu- ja sukunimesi"
lue FN LN #FN - Etunimi - nimi; LN - Sukunimi - sukunimi
echo "Hei! $LN, $FN !"
Aritmeettiset laskelmat
Yritä kirjoittaa komentokehotteeseen (tai komentotulkkiin) seuraava:
kaiku;1;+;1
Jos odotat näkeväsi numeron 2, tulet pettymään. Mitä sinun tulee tehdä, jos tarvitset BASH:ia numeroiden laskemiseen? Ratkaisu on seuraava:
kaiku;$((1+1))
Tämän seurauksena tulos on "loogisempi". Tätä merkintää käytetään aritmeettisten lausekkeiden arvioimiseen. Voit myös suorittaa sen seuraavasti:
kaiku;$
Jos sinun on käytettävä murtolukuja tai monimutkaisempaa matematiikkaa, voit käyttää bc:tä aritmeettisten lausekkeiden arvioimiseen.
Kun kirjoittaja suoritti komentotulkissa "echo;$", se palautti arvon 0. Tämä johtuu siitä, että jos bash vastaa, se käyttää vain kokonaislukuarvoja. Jos suoritat "echo;3/4|bc;-l", komentotulkki palauttaa oikean arvon 0,75.
bash haku
Miken viestistä (katso "Kiitos"-osio):
Käytät aina #!/bin/bash .. Voisitko antaa esimerkin kuinka selvittää bashin sijainti.
"locate bash" on parempi, mutta locate ei ole käytettävissä kaikissa koneissa.
"find ./ -name bash" juurihakemistosta toimii yleensä.
Voit tarkistaa seuraavat paikat:
ls -l /bin/bash
ls -l /sbin/bash
ls -l /usr/local/bin/bash
ls -l /usr/bin/bash
ls -l /usr/sbin/bash
ls -l /usr/local/sbin/bash
(Minulle ei tule heti mieleen mitään muuta hakemistoa... Hän on löytänyt bashia useimmista näistä paikoista eri järjestelmissä).
Voit myös kokeilla "which bash".
Ohjelman palautusarvon saaminen
Bashissa ohjelman palautusarvo tallennetaan erikoismuuttujaan $?.
Tämä esimerkki havainnollistaa kuinka kaapataan ohjelman palautusarvo; kirjoittaja oletti, että dada-hakemistoa ei ollut olemassa (mike ehdotti myös tätä).
#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?
Sieppaa komennon ulostulo
Tämä pieni komentosarja tekee kaikki taulukot kaikista tietokannoista (olettaen, että sinulla on MySQL asennettuna). Mieti myös tapoja muuntaa "mysql"-komento käyttämään sopivaa käyttäjätunnusta ja salasanaa.
#!/bin/bash
DBS=`mysql -uroot -e"näytä tietokannat"`
b:lle $DBS ;
tehdä
mysql -uroot -e"näytä taulukot kohteesta $b"
tehty
Useita lähdetiedostoja
Voit suorittaa useita tiedostoja lähdekomennolla.
TEHDÄ__
11. Taulukot
11.1 Merkkijonojen vertailuoperaattorit
(1) s1 = s2
(2) s1 ! = s2
(3) s1< s2
(4) s1 > s2
(5) -n s1
(6) -z s1
(1) s1 on sama kuin s2
(2) s1 ei ole sama kuin s2
(3) s1 aakkosjärjestyksessä edeltää s2:ta (nykyisen alueen mukaan)
(4) s1 seuraa aakkosjärjestyksessä s2:ta (nykyisen alueen mukaan)
(5) s1 ei ole nolla (sisältää yhden tai useamman merkin)
(6) s1 on nolla
11.2 Merkkijonojen vertailuesimerkkejä
Kahden merkkijonon vertailu.
#!/bin/bash
S1="merkkijono"
S2="merkkijono"
jos [ $S1=$S2 ];
sitten
echo "S1("$S1") ei ole yhtä suuri kuin S2("$S2")"
fi
jos [ $S1=$S1 ];
sitten
echo "S1("$S1") on yhtä kuin S1("$S1")"
fi
Tässä vaiheessa kirjoittaja pitää tarpeellisena lainata huomautusta Andreas Beckin kirjeestä, joka liittyy if [ $1 = $2 ] käyttöön.
Tämä ei ole hyvä idea, koska jos joko $S1 tai $S2 - tyhjä rivi, Saat syntaksivirheen. Hyväksyttävämpää olisi käyttää x$1;=;x$2 tai "$1";=;"$2" .
11.3 Aritmeettiset operaattorit
+
-
*
% (loppu)
11.4 Aritmeettiset vertailuoperaattorit
-lt (<)
-gt (>)
-le (<=)
-ge (>=)
-eq (==)
-ei (!=)
C-ohjelmoijien tarvitsee vain valita suluissa olevaa valittua käskyä vastaava lause.
Hyödyllisiä komentoja
Kees on kirjoittanut tämän osion uudelleen (katso Kiitokset-osio).
Jotkut näistä komennoista sisältävät käytännössä täysimittaiset komentokielet. Tässä selitetään vain tällaisten komentojen perusasiat. Saat lisätietoja katsomalla kunkin komennon man-sivuja.
sed (stream-editori)
Sed on ei-interaktiivinen editori. Sen sijaan, että muuttaisit tiedostoa siirtämällä kohdistinta näytöllä, sinun tulee käyttää sed-muokkausohjeiden komentosarjaa yhdessä muokattavan tiedoston nimen kanssa. Voit myös ajatella sediä suodattimena. Katso joitain esimerkkejä:
$sed "s/korvattava/korvattu/g" /tmp/dummy
Sed korvaa merkkijonon "to_be_replaced" merkkijonolla "korvattu" lukemalla tiedoston /tmp/dummy . Tulos lähetetään vakiolähtöön (yleensä konsoliin), mutta voit myös lisätä ">;capture" yllä olevalle riville, jotta sed lähettää tulosteen "capture"-tiedostoon.
$sed 12, 18d /tmp/dummy
Sed näyttää kaikki rivit paitsi rivit 12–18. Alkuperäinen tiedosto tämä komento ei muutu.
awk (tiedostojen käsittely, haku ja tekstinkäsittely)
AWK-ohjelmointikielellä on suuri määrä toteutuksia (yleisimpiä tulkkeja ovat GNU Projectin gawk ja "new awk" mawk.) Periaate on riittävän yksinkertainen: AWK etsii mallia; jokaiselle vastaavalle kuviolle suoritetaan jokin toiminto.
Tekijä on luonut uudelleen dummy-tiedoston, joka sisältää seuraavat rivit:
"testi123
testata
teestt"
$awk "/test/ (tulosta)" /tmp/dummy
testi 123
testata
Malli, jota AWK etsii, on "test", ja AWK:n toiminto, kun se kohtaa rivin /tmp/dummy, jossa on alimerkkijono "test", on "print".
$awk "/test/ (i=i+1) END (tulosta i)" /tmp/dummy
Jos etsit useita kuvioita, korvaa lainausmerkkien välissä oleva teksti "-f;file.awk". Tässä tapauksessa voit kirjoittaa kaikki mallit ja toiminnot "file.awk"-tiedostoon.
grep (tulostaa hakumallia vastaavat rivit)
Olemme tarkastelleet aiemmissa luvuissa useita grep-komentoja, jotka näyttävät kuviota vastaavat rivit. Grep pystyy kuitenkin paljon enemmän.
$grep "etsi tätä" /var/log/messages -c
Rivi "etsi tätä" löytyi 12 kertaa tiedostosta /var/log/messages.
wc (laskee rivejä, sanoja ja tavuja)
Seuraavassa esimerkissä voit nähdä, että tulos ei ole sitä mitä odotamme. Tässä tapauksessa valetiedosto sisältää seuraavan tekstin:
"bash esittely
miten testata tiedosto"
$wc --words --lines --bytes /tmp/dummy
2 5 34 /tmp/nukke
wc ei välitä parametrien järjestyksestä. Hän vie ne aina mukaansa vakiotilaus: <число;строк><число;слов><число;байтов><имя;файла>.
lajitella (lajittaa tekstitiedoston rivit)
Tässä tapauksessa valetiedosto sisältää seuraavan tekstin:
"b
c
a"
$sort /tmp/dummy
Tulos näyttää tältä:
a
b
c
Kometojen ei pitäisi olla niin yksinkertaisia :-)
bc (laskennallinen ohjelmointikieli)
bc suorittaa laskelmia komentoriviltä (syöte tiedostosta, mutta ei uudelleenohjauksen tai putken kautta) sekä käyttöliittymästä. Seuraava esimerkki näyttää joitain komentoja. Huomaa, että kirjoittaja käytti bc:tä valitsimella -q poistaakseen kehotteen käytöstä.
$bc -q
1 == 5
0
0.05 == 0.05
1
5 != 5
0
2 ^ 8
256
sqrt (9)
3
kun (i != 9) (
i = i + 1;
tulosta i
}
123456789
lopettaa
tput (alustaa päätteen tai kyselee terminfo-tietokantaa)
Pieni esimerkki tputin mahdollisuuksista:
$tput kuppi 10 4
Komentorivikehote tulee näkyviin koordinaateissa (y10,x4).
$tput reset
Näyttö tyhjennetään ja kehote tulee näkyviin (y1,x1). Huomaa, että (y0,x0) on vasen yläkulma.
$tput sarakkeita
80 Näyttää mahdollisen merkkien määrän x-suunnassa.
On erittäin suositeltavaa olla näiden ohjelmien kanssa "sinulla" (ainakin). On olemassa valtava määrä pieniä ohjelmia, jotka antavat sinulle mahdollisuuden tehdä todellista taikuutta komentorivillä.
[Jotkut esimerkit on otettu man-sivuilta tai usein kysytyistä kysymyksistä.]
Lisää käsikirjoituksia
Käytä komentoa kaikkiin tiedostoihin hakemistossa.
Esimerkki: hyvin yksinkertainen varmuuskopioskripti (tehokkaampi)
#!/bin/bash
SRCD="/home/" #SRCD - Lähdehakemisto - kotihakemisto
TGTD="/var/backups/" #TGTD - TarGeT-hakemisto - kohdehakemisto
OF=koti-$(päivämäärä +%Y%m%d).tgz #OF - Tulostiedosto - tulostiedosto
tar -cZf $TGTD$OF $SRCD
Tiedoston uudelleennimeäjä
#!/bin/sh
# renna: nimeä useita tiedostoja uudelleen erityissäännöillä
# Kirjoittaja - felix hudson tammikuu - 2000
#Katso ensinnäkin tämän ohjelman eri "tiloja".
#Jos ensimmäinen argumentti ($1) on sopiva, teemme tämän osan
#ohjelmat ja poistu.
# Tarkista, onko mahdollista lisätä etuliite.
jos [ $1 = p ]; sitten
#Mene nyt tilamuuttuja($1) ja etuliite ($2)
etuliite=$2 ; vaihto ; siirtää
# Tarkasta, onko vähintään yksi tiedosto määritetty.
# Muuten on parempi olla tekemättä mitään kuin nimetä uudelleen olematon
# tiedostot!!
jos [$1 = ]; sitten
poistu 0
fi
# Tämä for loop käsittelee kaikki antamamme tiedostot
#ohjelma.
# Se nimeää yhden uudelleen per tiedosto.
tiedostoa varten in$*
tehdä
mv $(tiedosto) $etuliite$tiedosto
tehty
#Sen jälkeen ohjelma sulkeutuu.
poistu 0
fi
# Tarkista jälkiliitteen lisäämisen ehto.
# Muuten Tämä osa lähes identtinen edellisen osion kanssa;
# katso sen sisältämät kommentit.
jos [ $1 = s ]; sitten
pääte=$2 ; vaihto ; siirtää
jos [$1 = ]; sitten
echo "ei määritettyjä tiedostoja"
poistu 0
fi
tiedostolle $*
tehdä
mv $(tiedosto) $tiedosto$liite
tehty
poistu 0
fi
# Tarkista uudelleennimeämisolosuhteet vaihtamisen yhteydessä.
jos [ $1 = r ]; sitten
siirtää
# Turvallisuussyistä kirjoittaja sisällytti tämän osan, jotta käyttäjä ei vahingoita tiedostoa
# ei määrittänyt mitä tehdä:
jos [ $# -lt 3 ] ; sitten
echo "Virhe; kelvollinen syöttö: renna r [lauseke] [korvaus] tiedostot... "
poistu 0
fi
# Harkitse muita tietoja
VANHA=$1 ; UUSI=2 dollaria; vaihto ; siirtää
# Tämä for-silmukka käy peräkkäin kaikkien tiedostojen läpi
# annettiin ohjelmalle.
# Se nimeää yhden uudelleen per tiedosto "sed"-ohjelman avulla.
# Tämä yksinkertainen ohjelma komentoriviltä, joka jäsentää standardin
# syöttää ja korvaa säännöllisen lausekkeen annetulla merkkijonolla.
# Tässä annamme sedille tiedostonimen (vakiosyöttönä) ja korvaamme
# pakollinen teksti.
tiedostolle $*
tehdä
uusi=`echo $(tiedosto) | sed s/$(OLD)/$(NEW)/g`
mv $(tiedosto) $uusi
tehty
poistu 0
fi
# Jos olemme saavuttaneet tämän rivin, se tarkoittaa, että ohjelma on annettu
# virheellistä parametria. Tässä yhteydessä käyttäjälle tulee selittää, kuinka se tehdään
#käyttö
echo "käytä:"
echo "renna p [etuliite] tiedostot.."
echo "renna s [suffix] files.."
echo "renna r [lauseke] [korvaus] tiedostot.."
poistu 0
#tehty!
Tiedoston uudelleennimeäjä (yksinkertainen)
#!/bin/bash
# renames.sh
# yksinkertainen uudelleennimeämisohjelma
kriteerit = $1
re_match=2 dollaria
korvaa = 3 dollaria
For i in $(ls *$criteria*);
tehdä
src=$i
tgt=$(echo $i | sed -e "s/$re_match/$replace/")
mv $src $tgt
tehty
Jos se, mitä tapahtuu, on erilaista kuin odotit (virheenkorjaus)
Kuinka voit soittaa BASHille?
Olisi kiva lisätä ensimmäiseen riviin
#!/bin/bash -x
Tämä tuottaa mielenkiintoisia tulostietoja.
Tietoja dokumentista
Voit vapaasti tehdä korjauksia, lisäyksiä tai mitä tahansa muuta, jos sen pitäisi mielestäsi olla tässä asiakirjassa. Kirjoittaja yrittää päivittää sen aina kun mahdollista.
Tämä huijausarkki kattaa seuraavat aiheet: komentotulkin esittely, navigointi, peruskomennot, ympäristömuuttujat, liittimet, liukuhihnat, I/O-uudelleenohjaus, käyttöoikeudet ja pikanäppäimet.
Bash Shellin esittely
Shell tai shell on ohjelma, meidän tapauksessamme nimeltä "bash", joka on lyhenne sanoista Bourne Again Shell. Shell ottaa käskysi ja välittää ne käyttöjärjestelmä. Päätteitä, kuten gnome-terminal , eterm , nxterm jne. käytetään vuorovaikutukseen järjestelmän kanssa.
Navigointi
SISÄÄN linux tiedostot ja hakemistoissa on hierarkkinen organisaatio, eli on olemassa tietty alkuhakemisto nimeltä juuri. Se sisältää tiedostoja ja alihakemistoja, jotka puolestaan sisältävät tiedostoja ja niiden alihakemistoja.
pwd
pwd-komento, lyhenne sanoista tulostaa työhakemistoa, näyttää tämänhetkinen olinpaikka hakemistorakenteessa.
CD
cd-komennolla voit vaihtaa uuteen hakemistoon.
mkdir
mkdir-komento luo uuden hakemiston nykyiseen hakemistoon.
Peruskomennot
mies
Man-komento näyttää komentooppaat. Esimerkiksi seuraava komento antaa kaikki tiedot aiheesta kissan käsky:
$ mies kissa
kissa
Cat-komento lukee argumenttina annetun tiedoston ja tulostaa sen sisällön tavallinen kanava ulostulo. Useiden tiedostojen välittäminen argumenttina tulostaa kaikkien tiedostojen ketjutetun sisällön.
kaiku
Kaiku-komento tulostaa argumenttinsa vakiotulosteeseen.
$ echo Hello World Hello World
Jos kutsut echoa ilman argumentteja, tulostetaan tyhjä merkkijono.
pää
Head-komento lukee minkä tahansa tekstin ensimmäiset 10 riviä ja tulostaa ne vakioputkeen. Lähtörivien määrää voidaan muuttaa:
$ head -50 test.txt
häntää
Tail-komento toimii kuten head-komento, mutta lukee rivit lopusta:
$ tail -50 test.txt
Voit myös tarkastella tiedostoon lisättyjä rivejä reaaliajassa -f-lipulla:
$ häntä -f testi.txt
Vähemmän
Komennolla less voit selata siirrettyä tiedostoa tai tekstiä molempiin suuntiin.
$ vähemmän test.txt $ ps aux | Vähemmän
Lisätietoja symbolin tarkoituksesta | käsitellään alla historiakomentoosiossa.
Yleiset pikanäppäimet | Kuvaus |
---|---|
G | Siirtyy tiedoston loppuun |
g | Siirtyy tiedoston alkuun |
:50 | Siirtyy tiedoston riville 50 |
q | Poistu vähemmän |
/hakusana | Hakumerkkijono, joka vastaa hakutermiä alla nykyinen linja |
/ | |
?hakusana | Hae riviä, joka vastaa sanaa "hakutermi" nykyisen rivin yläpuolelta |
? | Siirtyy seuraavaan vastaavaan hakutulokseen |
ylös | Siirtää yhden rivin ylöspäin |
alas | Siirtää yhden rivin alaspäin |
sivu ylös | Siirtyy yhden sivun ylöspäin |
sivu alas | Siirtää yhden sivun alaspäin |
totta
Tosi-komento palauttaa aina nollan poistumistilana osoituksena onnistumisesta.
väärä
Epätosi-komento palauttaa aina nollasta poikkeavan poistumistilan ilmoittaen epäonnistumisesta.
$?
$? on muuttuja, joka sisältää viimeisen poistumistilan käynnissä oleva komento. Tila ymmärretään yleensä ohjelman palautuskoodiksi. 0 tarkoittaa ohjelman onnistunutta suorittamista, mikä tahansa arvo, joka on suurempi kuin 0, kuvastaa sitä, että suorituksen aikana tapahtui joitain virheitä. Muuten, tästä syystä bashissa tosi (true) pidetään 0:na ja kaikki mikä ei ole 0 on epätosi (false):
$ totta $ kaiku $? 0 $false $echo $? 1
grep
Grep-komento etsii annettua merkkijonoa määritetty tiedosto:
$ kissa käyttäjät.txt käyttäjä:opiskelijan salasana:123 käyttäjä:opettajan salasana:321 $ grep "opiskelija" tiedosto1.txt käyttäjä:opiskelijan salasana:123
grep voi myös hyväksyä useita tiedostoja ja säännöllisiä lausekkeita selventääksesi tekstin muotoa.
historia
Historia-komento näyttää komentorivin historian. Sitä käytetään yleensä yhdessä grep-komennon kanssa tietyn komennon etsimiseen. Esimerkiksi seuraava koodi löytää kaikki komennot, jotka sisältävät merkkijonon g++:
$ historia | grep g++ 155 g++ tiedosto1.txt 159 g++ tiedosto2.txt
Tässä käytetään myös |-symbolia. - tämä on niin kutsuttu kuljetin (putki). Sen ansiosta voit ohjata yhden komennon lähdön toisen syötteeseen - siis yllä olevassa esimerkissä koko tarina, joka normaalitila Historia-komennon tulos suoraan päätteen ulostulo ohjataan syötteeksi grep:iin. Emme näe historiakomennon tulosta, mutta näemme grep-komennon tulosteen.
Tätä voi olla melko vaikea ymmärtää ilman harjoittelua, joten kokeile itse esimerkiksi ls , history , ps-komennoilla (kuvattu alla) ohjaamalla niiden tuloste esimerkiksi grep , sed tai less .
viedä
Vientikomento asettaa ympäristömuuttujat välitettäväksi lapsiprosesseille. Esimerkiksi näin voit välittää muuttujan nimen opiskelija-arvon kanssa:
$ vientinimi=opiskelija
ps
ps-komento näyttää tietoja käynnissä olevat prosessit.
$ ps PID TTY TIME CMD 35346 pts/2 00:00:00 bash
Näytössä näkyy neljä kohdetta:
- Prosessitunnus (PID),
- päätetyyppi (TTY),
- käsittelyaika (TIME),
- prosessin aloittaneen komennon nimi (CMD).
awk
awk-komento etsii ja korvaa tekstin tiedostoista tietyllä kuviolla: awk "pattern (toiminto)" test.txt
wget
wget-komento lataa tiedostot verkosta ja sijoittaa ne nykyinen hakemisto.
$ wget https://github.com/mikeizbicki/ucr-cs100
nc
ping
Ping-komento testaa verkkoyhteys.
$ ping google.com PING google.com (74.125.224.34) 56(84) tavua tietoa. 64 tavua lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms --- google.com ping-tilastot --- 1 paketti lähetetty, 1 vastaanotettu, 0 % pakettihäviö , aika 8 ms rtt min/avg/max/mdev = 7,794/8,422/10,792/0,699 ms
Lopussa olevat tilastot osoittavat ennen komennon suorittamista tehtyjen yhteyksien määrän ja niiden valmistumiseen kuluneen ajan.
git
Ympäristömuuttujat
Ympäristömuuttujat ovat nimettyjä muuttujia, jotka sisältävät yhden tai useamman sovelluksen käyttämiä arvoja.
PATH-muuttuja sisältää luettelon hakemistoista, joista järjestelmä etsii suoritettavia tiedostoja.
HOME-muuttuja sisältää polun kohteeseen kotihakemisto nykyinen käyttäjä.
Liittimet
Liitinten avulla voit suorittaa useita komentoja samanaikaisesti.
$ true && echo Hei Hei $ false || echo Hello Hei $ echo Hei ; ls Hei testi.txt tiedosto1.txt tiedosto2.txtKuljettimet
Putket tai putket mahdollistavat eri komentojen tulo- ja lähtökanavien yhdistämisen. Seuraavassa esimerkissä ls-komennon tulos putoaa head , jolloin vain ensimmäiset 10 kohdetta tulostetaan.
$ ls -l | pää
I/O-uudelleenohjaus
Tulostuksen uudelleenohjaus
varten tavallinen uudelleenohjaus ulostulossa käytetään symboleja > ja >> .
Tämä koodi esimerkiksi ohjaa ls:n tulosteen tiedostoon näytön sijaan:
$ ls > tiedostot.txt $ kissa tiedostot.txt tiedosto1.cpp näyte.txt
Jos tiedostoa ei ole olemassa, se luodaan, ja jos on, se korvataan. Ylikirjoituksen välttämiseksi sinun tulee käyttää >>-komentoa - se liittää tiedot tiedoston loppuun.
Tulon uudelleenohjaus
Normaali lähdön uudelleenohjaus käyttää symbolia< . В следующем примере sort берет входные данные из файла, а не с клавиатуры:
$ cat files.txt c b $lajittele< files.txt b c
Lajittelukomento tulostaa tiedoston sisällön näytölle, koska emme ole ohjanneet tulosta. Tämä voidaan tehdä näin:
$lajittele< files.txt >files_sorted.txt
Edistynyt uudelleenohjaus
Lisääminen & kohteeseen > johtaa uudelleenohjauksen tykkäämiseen tavallinen stream lähtö ja virhevirta. Esimerkiksi tiedosto test.cpp tulostaa merkkijonon stdout arvoon cout ja merkkijonon stderr muotoon cerr .
$ g++ test.cpp $ ./a.out >& testi.txt $ cat test.txt stdout stderr
Jos haluat näyttää tietyn tiedostokuvaaja, voit määrittää sen numeron > .
Nimi | Kuvaaja | Kuvaus |
---|---|---|
stdin | 0 | Vakiotulo |
stdout | 1 | vakiolähtö |
stderr | 2 | Normaali virhelähtö |
Jos haluat esimerkiksi ohjata stderr-tiedoston test.txt-tiedostoon, toimi seuraavasti:
$ g++ test.cpp $ ./a.out 2> test.txt stdout $ cat test.txt stderr
Käyttöoikeudet
Komento ls -l tulostaa paljon tietoa kunkin tiedoston käyttöoikeuksista:
chmod
Chmod-komento muuttaa tiedoston käyttöoikeuksia. Tässä on tyypillisiä lippuyhdistelmiä tiettyjen käyttäjien oikeuksien muuttamiseksi:
Voit kutsua chmodia kuvauksella siitä, mitä tehdä tietylle tiedostolle. Symboli - tarkoittaa oikeuksien poistamista, symboli + - lisäystä. Seuraava esimerkki tekee tiedostosta omistajan ja ryhmän luettavissa ja kirjoitettavissa:
$ chmod ug+rw testi.txt $ ls -l testi.txt -rw-rw---- 1 käyttäjäryhmä 1097374 26. tammikuuta 2:48 test.txt
Myös chmodia voidaan käyttää oktaaliluvut, jossa 1 on oikeuksien olemassaolo ja 0 poissaolo:
Rwx=111=7 rw-=110=6 r-x=101=5 r--=100=4
Seuraava komento toimii kuten edellinen.