„Bash“ scenarijai yra labai efektyvi priemonė automatizuoti užduotis, ypač tas, kurios naudoja kitas esamas programas. Ši automatika dažnai reikalauja pakartoti panašią operaciją kelis kartus, būtent ten už kilpą ateina į savo.
„Linux“ ir „Mac“ sistemų administratoriai paprastai yra susipažinę su scenarijais per terminalą, tačiau net „Windows“ vartotojai gali imkitės veiksmų su „Windows“ posistemiu, skirtu „Linux“ .
Kaip veikia „Bash Scripts“
„Bash“ scenarijus yra paprasčiausias teksto failas, kuriame yra komandų serija, kurią „bash“ apvalkalas gali skaityti ir vykdyti. „Bash“ yra numatytasis „Catalina“ „MacOS“ ir daugumos „Linux“ paskirstymų apvalkalas.
Jei niekada nedirbote su apvalkalo scenarijumi, turėtumėte pradėti nuo paprasčiausio atvejo. Tai leis jums praktikuoti pagrindines sąvokas, įskaitant scenarijaus kūrimą ir jo vykdymą.
Pirmiausia sukurkite šį failą patogioje vietoje (idealiu atveju atidarykite terminalą ir pirmiausia eikite į norimą katalogą):
#!/bin/bash
echo 'Hello, World'
Pirmoje eilutėje nurodoma, kaip paleisti šią programą (pvz., Naudojant „bash“ vertėją). Antrasis yra tik komanda, kaip ir bet kuri kita, kurią galite įvesti komandų eilutėje. Išsaugokite tą failą kaip hello_world.sh , tada:
$ chmod +x hello_world.sh
$ ./hello_world.sh
The chmod komanda pirmoje eilutėje daro failą vykdomąjį, tai reiškia, kad jį galima paleisti įvedus jo pavadinimą, kaip ir antroje eilutėje.
Jei matote žodžius „Sveiki, pasaulis“, išspausdintą ant jūsų terminalo eilutės, tada viskas veikia taip, kaip reikalaujama.
Kaip veikia kilpos
Paprastai programuojant yra du pagrindiniai kilpos tipai: skaitinis ir kiekvienam . Skaitinis tipas tradiciškai yra labiausiai paplitęs, tačiau naudojant „bash“ paprastai yra atvirkščiai.
Kilpų skaitmenys paprastai sutelkiami į vieną sveiką skaičių, kuris nustato, kiek pakartojimų bus atlikta, pavyzdžiui:
for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}
Tai pažįstamos kilpos ciklas, kuris kartosis lygiai 100 kartų, nebent cikle būtų pakeistas i, arba dėl kito teiginio for ciklo vykdymas būtų sustabdytas.
„Foreach“ kilpos, priešingai, linkusios veikti tokiose struktūrose kaip sąrašai ar masyvai ir kartojasi kiekvienam tos kolekcijos elementui:
people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}
Kai kurios kalbos naudoja šiek tiek kitokią sintaksę, kuri pakeičia surinkimo ir elemento tvarką:
people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}
Dėl kilpų
Bash, pamokslininkas - arba už - kilpas yra dažnesnis. Pagrindinė sintaksė yra tokia:
for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done
Pavyzdžiui, kartoti per tris aiškiai įvardytus failus:
svetaines, kuriose galite žiūrėti nemokamus filmus neatsisiuntę ar neprisiregistravę
for file in one.c two.c three.c
do
ls '$file'
done
Jei tokie failai yra dabartiniame kataloge, šio scenarijaus išvestis bus tokia:
one.c
two.c
three.c
Vietoj fiksuoto failų rinkinio sąrašą galima gauti naudojant visuotinį modelį (vieną, įskaitant pakaitos simbolius - specialiuosius simbolius, kurie žymi kitus simbolius). Šiame pavyzdyje for for ciklas kartojasi visuose failuose (dabartiniame kataloge), kurių pavadinimai baigiasi „.xml“:
for file in *.xml
do
ls -l '$file'
done
Štai keletas išvesties pavyzdžių:
$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml
Tai gali atrodyti kaip ilgai trunkantis būdas:
$ ls -l *.xml
Tačiau yra didelis skirtumas: for ciklas vykdo ls programa 2 kartus, kiekvieną kartą jai perduodamas vienas failo vardas. Atskirame ls pavyzdyje glob modelis (*.xml) pirmiausia sutampa su failų pavadinimais, o paskui siunčia juos visus kaip atskirus komandinės eilutės parametrus į vieną egzempliorių ls .
Štai pavyzdys, kuriame naudojama wc (žodžių skaičiavimo) programa, kad skirtumas būtų akivaizdesnis:
$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total
The wc programa skaičiuoja eilučių skaičių kiekviename faile atskirai, tada išspausdina bendrą jų skaičių. Priešingai, jei wc veikia for cikle:
for file in *.xml
do
wc -l $file
done
Vis tiek matysite kiekvieno failo skaičių:
44 feed.xml
231 sitemap.xml
Tačiau bendros sumos nėra, nes wc yra vykdomas atskirai, kiekvieną kartą, kai ciklas kartojasi.
Kai sąrašas nėra sąrašas
Yra labai lengva ir dažna klaida tvarkant kilpas dėl to, kaip bash tvarko cituojamus argumentus/eilutes. Failų sąrašo peržiūra turėtų būti atliekama taip:
for file in one.c two.c
Ne taip:
for file in 'one.c two.c'
Antrasis pavyzdys apima failų pavadinimus dvigubose kabutėse, todėl gaunamas sąrašas tik su vienu parametru; for ciklas bus vykdomas tik vieną kartą. Tokios problemos galima išvengti naudojant kintamąjį:
FILES='one.c two.c'
for file in $FILES
do
...
done
Atkreipkite dėmesį, kad pati kintamojo deklaracija turi savo reikšmę įtraukti į kabutes!
ką daryti kompiuteryje, kai nuobodu
Už be sąrašo
Nereikia nieko kartoti, for ciklas veikia pagal visus komandinės eilutės argumentus, kurie buvo pateikti scenarijui, kai jis buvo iškviestas. Pavyzdžiui, jei turite scenarijų pavadinimu args.sh kuriame yra:
#!/bin/sh
for a
do
echo $a
done
Tada vykdydami args.sh gausite šiuos dalykus:
$ ./args.sh one two three
one
two
three
Bašas atpažįsta šį atvejį ir gydo už padarymą kaip atitikmuo už $@ do kur $@ yra specialus kintamasis, vaizduojantis komandinės eilutės argumentus.
Tradicinio skaitmeninio ciklo emuliacija
„Bash“ scenarijai dažnai susiduria su failų sąrašais ar išvesties eilutėmis iš kitų komandų, todėl „for in“ tipo ciklas yra įprastas. Tačiau tradicinė c stiliaus operacija vis dar palaikoma:
for (( i=1; i<=5; i++ ))
do
echo $i
done
Tai klasikinė forma, kurią sudaro trys dalys:
- kintamasis inicijuojamas (i = 1), kai pirmą kartą susiduriama su kilpa
- ciklas tęsiasi tol, kol būklė (t<=5) is true
- kiekvieną kartą aplink ciklą kintamasis didinamas (i ++)
Tarp dviejų verčių kartojimas yra pakankamai dažnas reikalavimas, kad yra trumpesnė, šiek tiek mažiau paini alternatyva:
for i in {1..5}
do
echo $i
done
Vykdomas petnešų išplėtimas efektyviai išverčia aukščiau pateiktą kilpą į:
for i in 1 2 3 4
Smulkesnės kilpos valdymas su pertrauka ir tęskite
Sudėtingesnėms kilpoms dažnai reikia išeiti iš anksto arba nedelsiant iš naujo paleisti pagrindinę kilpą su kita reikšme. Norėdami tai padaryti, „bash“ skolinasi pertrauką ir tęsia teiginius, įprastus kitose programavimo kalbose. Štai pavyzdys, kuriame abu naudojami norint surasti pirmąjį daugiau nei 100 simbolių ilgio failą:
#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done
For ciklas čia veikia su visais dabartinio katalogo failais. Jei failas nėra įprastas failas (pvz., Jei tai katalogas), teiginys tęsti naudojamas ciklui paleisti iš naujo su kitu failu. Jei tai įprastas failas, antrasis sąlyginis blokas nustatys, ar jame yra daugiau nei 100 simbolių. Jei taip, pertraukos sakinys naudojamas nedelsiant palikti for ciklą (ir pasiekti scenarijaus pabaigą).
Išvada
„Bash“ scenarijus yra failas, kuriame yra instrukcijų rinkinys, kurį galima vykdyti. A ciklas leidžia dalį scenarijaus pakartoti daug kartų. Naudojant kintamuosius, išorines komandas ir pertraukos bei tęsimo teiginius, „bash“ scenarijai gali pritaikyti sudėtingesnę logiką ir atlikti įvairias užduotis.
Dalintis Dalintis „Tweet“ Paštu Ar verta atnaujinti į „Windows 11“?„Windows“ buvo pertvarkytas. Bet ar to pakanka norint įtikinti jus pereiti nuo „Windows 10“ prie „Windows 11“?
Skaityti toliau Susijusios temos- Programavimas
- Linux
Bobby yra technologijų entuziastas, kuris beveik du dešimtmečius dirbo programinės įrangos kūrėju. Jis aistringai žaidžia, dirba „Switch Player Magazine“ apžvalgų redaktoriumi ir yra pasinėręs į visus internetinės publikacijos ir žiniatinklio kūrimo aspektus.
Daugiau iš Bobby JackPrenumeruokite mūsų naujienlaiškį
Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. Knygų ir išskirtinių pasiūlymų!
Norėdami užsiprenumeruoti, spustelėkite čia