Bashi skriptid on ülitõhus viis ülesannete automatiseerimiseks, eriti nende jaoks, mis kasutavad ära teisi olemasolevaid programme. See automatiseerimine nõuab sageli sarnase toimingu kordamist mitu korda, just seal silmuse jaoks tuleb omaette.
Linuxi ja Maci süsteemiadministraatorid tunnevad tavaliselt terminali kaudu skriptimist, kuid isegi Windowsi kasutajad saavad seda teha saada osa operatsioonist Windowsi allsüsteemiga Linuxile.
Kas peate arvutit vahetama või VM-i käitama, pole Linuxi aega kasutada? Käivitage Linux Windows 10-s hoopis Bashi shelliterminaliga!
Kuidas Bashi skriptid töötavad
Bashi skript on lihtsalt tavaline tekstifail, mis sisaldab rida käske, mida bashi kest saab lugeda ja täita. Bash on Catalina-eelse macOS-i ja enamiku Linuxi distributsioonide vaikekest.
Kui te pole kunagi varem shelliskriptiga töötanud, peaksite alustama absoluutse lihtsa juhtumiga. See võimaldab teil harjutada põhimõisteid, sealhulgas skripti loomist ja selle käivitamist.
Kõigepealt looge järgmine fail mugavas kohas (ideaaljuhul avage terminal ja navigeerige kõigepealt soovitud kataloogi):
#! / bin / bash
kaja "Tere, maailm"
Esimene rida annab teada, kuidas see programm töötab (st kasutades bashi tõlki). Teine on lihtsalt käsk nagu iga teine, mille võite käsureale sisestada. Salvestage see fail nimega tere_maailm.sh, siis:
$ chmod + x hello_world.sh
$ ./hello_world.sh
The chmod Esimese rea käsk muudab faili käivitatavaks, see tähendab, et seda saab käivitada selle nime tippimisega, nagu teisel real.
Kui näete, et terminali reale ilmub trükitud sõna „Tere, maailm”, töötab kõik nõutult.
Kuidas aasad toimivad
Üldiselt on loopil kaks peamist tüüpi: numbriline ja igaühele. Numbriline tüüp on traditsiooniliselt kõige tavalisem, kuid bashi kasutuses on see tavaliselt vastupidi.
Silmuste numbriline arv keskendub tavaliselt ühele täisarvule, mis määrab mitu kordust, näiteks:
jaoks (i = 0; i <100; i ++) {
/ * korduvalt täidetavad avaldused * /
}
See on tuttava välimusega silmus, mis kordub täpselt 100 korda, välja arvatud juhul, kui i muudetakse tsüklis või kui mõni teine lause põhjustab for loopi täitmise peatumise.
Foreachi silmused seevastu kipuvad töötama struktuurides, nagu loendid või massiivid, ja kordama iga selle kollektsiooni üksust:
inimesed = ["Peetrus", "Paulus", "Maarja"]
foreach (inimesed kui inimene) {
kui (isik == "Paulus") {
...
}
}
Mõnes keeles kasutatakse pisut erinevat süntaksit, mis vahetab kogu ja järjestuse järjestuse:
inimesed = ["Peetrus", "Paulus", "Maarja"]
for (inimene inimestes) {
kui (isik == "Paulus") {
...
}
}
Sest aasades
Bashis, foreach - või aastal sisse—Loop on tavalisem. Põhiline süntaks on lihtsalt:
arg jaoks [loendis]
tegema
/ * korduvalt täidetavad avaldused * /
/ * arg väärtuse saab kasutada, kasutades $ arg * /
tehtud
Näiteks kolme selgesõnalise nimega faili kordamiseks:
faili jaoks üks.c kaks. c kolm. c
tegema
ls "$ file"
tehtud
Kui sellised failid on praeguses kataloogis olemas, on selle skripti väljund:
üks. c
kaks. c
kolm. c
Fikseeritud failikomplekti asemel saab loendi hankida glob-mustri abil (üks sisaldab metamärke - erimärke, mis tähistavad teisi märke). Järgmises näites kordab for loop kõik failid (praeguses kataloogis), mille nimed lõpevad ".xml":
faili jaoks * .xml
tegema
ls -l "$ fail"
tehtud
Siin on näite väljund:
$ -rw-r - r-- 1 bobby personal 2436 3. november 2019 feed.xml
$ -rw-r - r-- 1 bobitöötaja 6447 27. oktoober 16:24 sitemap.xml
See võib tunduda väga pikaajaline viis:
$ ls -l * .xml
Kuid seal on oluline erinevus: for loop täidab ls programmeerige 2 eraldi korda, iga kord edastatakse talle üks failinimi. Eraldi näites ls sobitab glob muster (* .xml) kõigepealt failinimed ja saadab need kõik üksikute käsurea parameetritena ühele ls.
Siin on näide, mis kasutab tualett (sõnade loendamise) programm, et muuta erinevus ilmsemaks:
$ wc -l * .xml
44 feed.xml
231 saidikaart.xml
Kokku 275
The tualett programm loeb ridade arvu igas failis eraldi, seejärel prindib kõigi nende ridade koguarvu. Seevastu, kui tualett töötab for-loopi piires:
faili jaoks * .xml
tegema
wc -l $ fail
tehtud
Näete endiselt iga faili arvu:
44 feed.xml
231 saidikaart.xml
Kuid üldist kokkuvõtet pole, sest tualett käivitatakse eraldi, iga kord, kui silmus kordub.
Kui loend pole loend
Silmuste käsitlemisel on väga lihtne ja tavaline viga, mis tuleneb viisist, kuidas bash käsitleb tsiteeritud argumente / stringe. Failide loendi sirvimine peaks toimuma järgmiselt:
faili jaoks üks.c kaks.c
Mitte niimoodi:
faili jaoks failis "one.c two.c"
Teine näide hõlmab failinimesid jutumärkides, mille tulemuseks on loend, millel on ainult üks parameeter; for loop käivitub ainult üks kord. Seda probleemi saab vältida muutuja kasutamisega järgmistel juhtudel:
FILES = "üks.c kaks.c"
faili jaoks failis $ FILES
tegema
...
tehtud
Pange tähele, et muutujadeklaratsioon ise peab lisama selle väärtuse jutumärkidesse!
Sest ilma nimekirjata
Kuna midagi pole võimalik läbi korrata, töötab for silmus mis tahes käsurea argumentidega, mis skriptile esitati, kui neid kutsuti. Näiteks kui teil on nimega skript args.sh mis sisaldab järgmist:
#! / bin / sh
le
tegema
kaja $ a
tehtud
Seejärel annab args.sh käivitamine järgmise:
$ ./args.sh üks kaks kolm
üks
kaks
kolm
Bash tunneb selle juhtumi ära ja kohtleb tegemiseks samaväärsena teenuse $ @ do jaoks kus $ @ on spetsiaalne muutuja, mis tähistab käsurea argumente.
Loopi jaoks traditsioonilise numbri jäljendamine
Bash-skriptid käsitlevad sageli failide loendeid või muude käskude väljundiridasid, nii et silmus for in on tavaline. Siiski toetatakse endiselt traditsioonilist c-stiilis toimingut:
for ((i = 1; i <= 5; i ++))
tegema
kaja $ i
tehtud
See on kolmeosaline klassikaline vorm, milles:
- muutuja initsialiseeritakse (i = 1), kui silmus esimest korda kokku puutub
- silmus jätkub seni, kuni tingimus (i <= 5) on tõene
- iga kord ringjoone jooksul suurendatakse muutujat (i ++)
Kahe väärtuse vahel kordamine on piisavalt tavaline nõue, et on olemas lühem, veidi vähem segane alternatiiv:
i jaoks ajavahemikus {1..5}
tegema
kaja $ i
tehtud
Toimuv trakside laiendamine teisendab ülaltoodud silmuse jaoks järgmiselt:
i jaoks 1 2 3 4
Peenema silmuse juhtimine koos katkestuse ja jätkamisega
Silmuste jaoks keerukamad vajavad sageli viisi varakult väljumiseks või peatsilmi taaskäivitamiseks järgmise väärtusega. Selleks laenab bash pausi ja jätkab teistes programmeerimiskeeltes levinud väiteid. Siin on näide, mis kasutab mõlemat esimese enam kui 100 tähemärgi pikkuse faili leidmiseks.
#! / bin / bash
faili jaoks *
tegema
kui [! -f "$ fail"]
siis
echo "$ fail pole fail"
jätkata
fi
num_chars = $ (wc -c echo $ fail on "$ num_chars tähemärki pikk"
kui [$ num_chars -gt 100]
siis
kaja "Leitud $ fail"
murda
fi
tehtud
Siinne for loop töötab kõigi praeguse kataloogi failidega. Kui fail ei ole tavaline fail (nt kui see on kataloog), kasutatakse jätkamise lauset tsükli taaskäivitamiseks järgmise failiga. Kui see on tavaline fail, määrab teine tingimuslik plokk, kas see sisaldab rohkem kui 100 tähemärki. Kui jah, kasutatakse break-lauset for-silmusest kohe lahkumiseks (ja skripti lõppu jõudmiseks).
Järeldus
Bashi skript on fail, mis sisaldab käskude komplekti, mida saab käivitada. A for loop võimaldab skripti osa korrata mitu korda. Muutujate, väliste käskude ning katkestamise ja jätkamise lausete abil saavad bashi skriptid rakendada keerukamat loogikat ja täita paljusid ülesandeid.
Aruanne viitab sellele, et Apple'i rakenduse privaatsussiltidel võib olla probleeme.
- Programmeerimine
- Linux
![](/f/ade92ea97f948de4ee8382a1335e2f8c.jpg)
Bobby on tehnoloogiaentusiast, kes töötas tarkvaraarendajana peaaegu kaks aastakümmet. Ta on mängude vastu kirglik, töötab Switch Player Magazine'is arvustuste toimetajana ning on süvenenud veebiväljaannete ja veebiarenduse kõigisse aspektidesse.
Telli meie uudiskiri
Liituge meie uudiskirjaga, kus leiate tehnilisi näpunäiteid, ülevaateid, tasuta e-raamatuid ja eksklusiivseid pakkumisi!
Veel üks samm !!!
Palun kinnitage oma e-posti aadress meilis, mille me just saatsime.