Säikeet, ohjelmaputket ja uudelleenohjaukset. Yksinkertainen varmuuskopiointi

Tänään alamme analysoida bashin ominaisuuksia. Koska tämä kysymys on melko laaja, se on jaettava useisiin osiin. Joten mennään yksinkertaisesta monimutkaiseen. Muuten, on erittäin suuri todennäköisyys, että tiedot oppivat aikana oppia bashia, hyödyllinen työskennellessäsi muiden komentotulkkien kanssa.
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 tehty

Harkitse 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 0

Esimerkin 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 paluukoodin

Esimerkki 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/null

ohjaa cat /dev/random tulos hakemistoon /dev/null (täysin hyödytön toiminto) tai

ls -la > listaus

kirjoittaa 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_password

kun 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 > virhetiedosto

numero 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 >& 1

merkki "&" 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_list

Komennon 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 valmis

Tää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äimetKuvaus
GSiirtyy tiedoston loppuun
gSiirtyy tiedoston alkuun
:50 Siirtyy tiedoston riville 50
qPoistu vähemmän
/hakusanaHakumerkkijono, joka vastaa hakutermiä alla nykyinen linja
/
?hakusanaHae riviä, joka vastaa sanaa "hakutermi" nykyisen rivin yläpuolelta
? Siirtyy seuraavaan vastaavaan hakutulokseen
ylösSiirtää yhden rivin ylöspäin
alasSiirtää yhden rivin alaspäin
sivu ylösSiirtyy yhden sivun ylöspäin
sivu alasSiirtää 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.txt

Kuljettimet

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 > .

NimiKuvaajaKuvaus
stdin0 Vakiotulo
stdout1 vakiolähtö
stderr2 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.