Viskas, ką reikia žinoti apie „Bash for Loops“ sistemoje „Linux“

Viskas, ką reikia žinoti apie „Bash for Loops“ sistemoje „Linux“

„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 - 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:

  1. kintamasis inicijuojamas (i = 1), kai pirmą kartą susiduriama su kilpa
  2. ciklas tęsiasi tol, kol būklė (t<=5) is true
  3. 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
Apie autorių Bobis Džekas(Paskelbti 58 straipsniai)

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 Jack

Prenumeruokite 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