Bash skripti ir ļoti efektīvs uzdevumu automatizācijas līdzeklis, it īpaši tie, kas izmanto citu esošo programmu priekšrocības. Šī automatizācija bieži prasa vairākas reizes atkārtot līdzīgu darbību, tieši tur par cilpu nonāk savējos.
Linux un Mac sistēmu administratori parasti pārzina skriptu izveidi, izmantojot termināli, taču pat Windows lietotāji to var iesaistieties darbībā ar Windows apakšsistēmu Linux.
Jums nav laika izmantot Linux, lai pārslēgtos uz citu datoru vai palaistu VM? Palaidiet Linux operētājsistēmā Windows 10 ar Bash čaulas termināli!
Kā darbojas Bash skripti
Bash skripts ir vienkārši teksta fails, kurā ir virkne komandu, kuras bash apvalks var nolasīt un izpildīt. Bash ir noklusējuma apvalks pirms Catalina macOS un lielākajā daļā Linux izplatījumu.
Ja jūs nekad iepriekš neesat strādājis ar čaulas skriptu, jums jāsāk ar absolūti vienkāršāko gadījumu. Tas ļaus jums praktizēt galvenos jēdzienus, tostarp skripta izveidi un tā izpildi.
Vispirms izveidojiet šādu failu ērtā vietā (ideālā gadījumā atveriet termināli un vispirms dodieties uz vajadzīgo direktoriju):
#! / bin / bash
atbalss "Sveika, pasaule"
Pirmajā rindiņā ir norādīts, kā darbojas šī programma (t.i., izmantojot bash tulku). Otrais ir tikai tāda komanda kā jebkura cita, kuru jūs varētu ievadīt komandrindā. Saglabājiet šo failu kā labdien_pasaule.sh, tad:
$ chmod + x hello_world.sh
$ ./hello_world.sh
The chmod komandas pirmajā rindā padara failu izpildāmu, kas nozīmē, ka to var palaist, ierakstot tā nosaukumu, tāpat kā otrajā rindā.
Ja uz termināļa līnijas redzat uzdrukātu vārdu “Sveika, pasaule”, viss darbojas atbilstoši prasībai.
Kā darbojas cilpas
Parasti programmēšanā ir divi galvenie cilpu veidi: ciparu un katram. Tradicionāli visizplatītākais ir ciparu veids, taču, lietojot bash, tas parasti notiek otrādi.
Cipru skaitliskais skaitlis parasti koncentrējas uz vienu veselu skaitli, kas nosaka, cik daudz atkārtojumu tiks veikts, piemēram:
par (i = 0; i <100; i ++) {
/ * atkārtoti izpildāmi paziņojumi * /
}
Šī ir pazīstama cilpa, kas atkārtosies tieši 100 reizes, ja vien i nav mainīts cilpas ietvaros vai kāds cits paziņojums neļauj for for ciklam izpildīt.
Turpretim Foreach cilpas mēdz darboties uz tādām struktūrām kā saraksti vai masīvi, un atkārto katru vienumu šajā kolekcijā:
cilvēki = ["Pēteris", "Pāvils", "Marija"]
foreach (cilvēki kā persona) {
ja (persona == "Pāvils") {
...
}
}
Dažās valodās tiek izmantota nedaudz atšķirīga sintakse, kas maina kolekcijas un vienības secību:
cilvēki = ["Pēteris", "Pāvils", "Marija"]
par (persona cilvēkos) {
ja (persona == "Pāvils") {
...
}
}
Par Loops
Bashā foreach - vai par—Cēlonis ir biežāk sastopams. Pamata sintakse ir vienkārši:
par arg [sarakstā]
darīt
/ * atkārtoti izpildāmi paziņojumi * /
/ * arg vērtību var iegūt, izmantojot $ arg * /
izdarīts
Piemēram, atkārtot trīs skaidri nosauktus failus:
failam vienā.c div.c trīs.c
darīt
ls "$ fails"
izdarīts
Ja šādi faili pastāv pašreizējā direktorijā, šī skripta izeja būs:
viens.c
divi. c
trīs.c
Fiksēta failu kopas vietā sarakstu var iegūt, izmantojot glob modeli (tādu, kurā ir aizstājējzīmes - īpašās rakstzīmes, kas apzīmē citas rakstzīmes). Šajā piemērā for cikls atkārto visus failus (pašreizējā direktorijā), kuru nosaukumi beidzas ar ".xml":
failam * .xml
darīt
ls -l "$ fails"
izdarīts
Šeit ir daži izvades piemēri:
$ -rw-r - r-- 1 bobi darbinieki 2436, 2019. gada 3. novembris feed.xml
$ -rw-r - r-- 1 bobi darbinieki 6447 27. oktobris 16:24 sitemap.xml
Tas var ļoti līdzināties ilglaicīgam darbības veidam:
$ ls -l * .xml
Bet ir būtiska atšķirība: for cikls izpilda ls programma 2 atsevišķas reizes, katru reizi nododot tai vienu faila nosaukumu. Atsevišķā ls piemērā glob modelis (* .xml) vispirms saskaņo failu nosaukumus un pēc tam tos visus kā atsevišķus komandrindas parametrus nosūta vienam ls.
Šeit ir piemērs, kas izmanto tualete (vārdu skaits) programma, lai padarītu atšķirību acīmredzamāku:
$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 kopā
The tualete programma atskaita rindiņu skaitu katrā failā atsevišķi, pēc tam izdrukā kopējo skaitu visos failos. Turpretī, ja tualete darbojas for for ciklā:
failam * .xml
darīt
wc -l $ fails
izdarīts
Jūs joprojām redzēsiet katra faila skaitu:
44 feed.xml
231 sitemap.xml
Bet kopējā kopsavilkuma nav, jo tualete tiek izpildīts atsevišķi, katru reizi, kad cilpa atkārtojas.
Kad saraksts nav saraksts
Strādājot ar cilpām, ir ļoti vienkārša un izplatīta kļūda, pateicoties tam, kā Bass rīkojas ar citētajiem argumentiem / virknēm. Failu saraksta pārlūkošana jāveic šādi:
failam vienā.c div.c
Nepatīk šādi:
failam mapē "one.c two.c"
Otrais piemērs failu nosaukumus ievieto pēdiņās, kā rezultātā tiek izveidots saraksts ar tikai vienu parametru; for cikls tiks izpildīts tikai vienu reizi. Šo problēmu var novērst, izmantojot mainīgo šādos gadījumos:
FILES = "one.c two.c"
failam mapē $ FILES
darīt
...
izdarīts
Ņemiet vērā, ka mainīgajai deklarācijai ir jāievieto tā vērtība divkāršās pēdiņās!
Par Bez saraksta
Tā kā nekas nav atkārtojams, for cikls darbojas neatkarīgi no komandrindas argumentiem, kas tika sniegti skriptam, kad tie tika izsaukti. Piemēram, ja jums ir skripts ar nosaukumu args.sh satur:
#! / bin / sh
priekš
darīt
atbalss $ a
izdarīts
Pēc tam izpildot args.sh, jūs iegūsiet sekojošo:
$ ./args.sh viens divi trīs
viens
divi
trīs
Bašs atzīst šo gadījumu un izturas pret to par izdarīšanu kā ekvivalents par $ @ do kur $ @ ir īpašs mainīgais, kas apzīmē komandrindas argumentus.
Atdarinot tradicionālo skaitlisko cilpu
Bash skripti bieži nodarbojas ar failu sarakstiem vai citu komandu izvades rindām, tāpēc for in cilpa ir izplatīta. Tomēr joprojām tiek atbalstīta tradicionālā c stila darbība:
par ((i = 1; i <= 5; i ++))
darīt
atbalss $ i
izdarīts
Šī ir klasiskā forma ar trim daļām, kurās:
- mainīgais tiek inicializēts (i = 1), pirmo reizi sastopoties ar cilpu
- cilpa turpinās tik ilgi, kamēr nosacījums (i <= 5) ir patiess
- katru reizi ap ciklu mainīgais tiek palielināts (i ++)
Atkārtojums starp divām vērtībām ir pietiekami izplatīta prasība, ka pastāv īsāka, nedaudz mazāk mulsinoša alternatīva:
priekš i {1..5}
darīt
atbalss $ i
izdarīts
Notikuma paplašināšana, kas notiek, efektīvi pārveido iepriekš minēto cilpu:
par i i 1 2 3 4
Smalkāka cilpas vadība ar pārtraukumu un turpināšanu
Sarežģītākām cilpām bieži ir nepieciešams veids, kā iziet agri vai nekavējoties restartēt galveno cilpu ar nākamo vērtību pēc kārtas. Lai to izdarītu, bash aizņemas pārtraukumu un turpina apgalvojumus, kas ir izplatīti citās programmēšanas valodās. Šis piemērs izmanto abus, lai atrastu pirmo failu, kura garums pārsniedz 100 rakstzīmes.
#! / bin / bash
failam *
darīt
ja [! -f "$ fails"]
pēc tam
echo "$ fails nav fails"
Turpināt
fi
num_chars = $ (wc -c echo $ fails ir "$ num_chars rakstzīmju garš"
ja [$ num_chars -gt 100]
pēc tam
atbalss "Atrasts $ fails"
pārtraukums
fi
izdarīts
For cikls šeit darbojas ar visiem failiem pašreizējā direktorijā. Ja fails nav parasts fails (piemēram, ja tas ir direktorijs), turpinājuma paziņojums tiek izmantots, lai restartētu cilpu ar nākamo failu pēc kārtas. Ja tas ir parasts fails, otrajā nosacītajā blokā tiks noteikts, vai tajā ir vairāk nekā 100 rakstzīmes. Ja tā, tad pārtraukuma paziņojums tiek izmantots, lai nekavējoties atstātu for for (un sasniegtu skripta beigas).
Secinājums
Bash skripts ir fails, kurā ir izpildāmo instrukciju kopums. A for loop ļauj skripta daļu atkārtot daudzas reizes. Izmantojot mainīgos, ārējās komandas un pārtraukuma un turpināšanas paziņojumus, bash skripti var izmantot sarežģītāku loģiku un veikt plašu uzdevumu klāstu.
Ziņojums liecina, ka Apple lietotņu konfidencialitātes etiķetēm var būt dažas problēmas.
- Programmēšana
- Linux
Bobijs ir tehnoloģiju entuziasts, kurš gandrīz divas desmitgades strādāja par programmatūras izstrādātāju. Viņš aizrauj spēles, strādā par atsauksmju redaktoru žurnālā Switch Player un ir iedziļinājies visos tiešsaistes izdevējdarbības un tīmekļa izstrādes aspektos.
Abonējiet mūsu biļetenu
Pievienojieties mūsu biļetenam, lai iegūtu padomus par tehnoloģijām, atsauksmes, bezmaksas e-grāmatas un ekskluzīvus piedāvājumus!
Vēl viens solis !!!
Lūdzu, apstipriniet savu e-pasta adresi e-pastā, kuru tikko nosūtījām.