9 Shembuj të sytheve në skriptet Linux Bash
Cikli i gjithanshëm i Bash for
bën shumë më tepër sesa qarkullon një numër të caktuar herë. Ne përshkruajmë variantet e tij të shumta në mënyrë që t'i përdorni ato me sukses në skriptet tuaja Linux.
Loop për
Të gjitha gjuhët e skriptimit dhe programimit kanë një mënyrë për të trajtuar unazat. Një lak është një pjesë e kodit që dëshironi ta keni ekzekutuar në mënyrë të përsëritur. Në vend që të shkruani të njëjtin grup udhëzimesh në skriptin tuaj, përsëri dhe përsëri, një lak do të përsërisë një pjesë të kodit pa pushim për ju.
Cikli Bash for
është shumë fleksibël. Mund të punojë me numra, fjalë, vargje, variabla të linjës së komandës ose dalje të komandave të tjera. Këto përdoren në titullin të ciklit. Kreu dikton se me çfarë funksionon cikli - për shembull, numrat ose vargjet - dhe cili është kushti përfundimtar që do të ndalojë ciklin.
trupi e ciklit përmban kodin që dëshironi të përsërisni. Mban atë që dëshironi që cikli të bëjë. Trupi i ciklit mund të përmbajë çdo komandë të vlefshme skripti.
Një variabël i quajtur numëruesi i ciklit ose itteruesi përdoret për të kaluar nëpër një sërë vlerash ose një listë artikujsh të dhënash. Për çdo cikli, përsëritësi merr vlerën e numrit të ardhshëm, vargut ose çfarëdo lloji të të dhënave në të cilin cikli po përsëritet. Kjo lejon që qarku të punojë me vlerat e secilit prej elementeve të të dhënave me radhë, ose edhe në disa raste të manipulojë vetë artikujt e të dhënave.
E thjeshtë për sythe
Nëse po kërkoni të shkruani ciklin tuaj të parë për, këta shembuj të thjeshtë do t'ju bëjnë të filloni.
për sythe duke përdorur listat numerike
Ju mund të ekzekutoni një lak për
në vijën e komandës. Kjo komandë krijon dhe ekzekuton një cikli të thjeshtë për
. Iteratori është një variabël i quajtur i
. Ne do të caktojmë i
të jetë secila nga vlerat në listën e numrave, me radhë. Trupi i lakut do ta printojë atë vlerë në dritaren e terminalit. Kushti që përfundon këtë cikli është kur i
të ketë përsëritur në të gjithë listën e numrave.
for i in 1 2 3 4 5; do echo $i; done
Është e rëndësishme të theksohet këtu se ndryshorja i
rritet me një sa herë që cikli rrotullohet, por kjo ndodh sepse lista e numrave rritet me një çdo herë.
Kjo listë numrash fillon me 3 dhe rritet me hapa nga dy, pastaj në mënyrë arbitrare kapërcehet në 44.
for i in 3 5 7 9 11 44; do echo $i; done
Nuk ka asnjë ndryshim për ciklin for
. Fillon në një fund të listës dhe përdor secilën vlerë me radhë, derisa të përdoren të gjitha vlerat në listë.
As numrat nuk duhet të jenë në rend rritës. Ato mund të jenë në çdo mënyrë.
for i in 3 43 44 11 9; do echo $i; done
për sythe duke përdorur listat e fjalëve
Po aq lehtë mund të bëjmë të njëjtën gjë me fjalë. Kopjojeni tekstin e skenarit në një redaktues dhe ruajeni si word-list.sh.
#!/bin/bash
for word in This is a sequence of words
do
echo $word
done
Do t'ju duhet të përdorni chmod
për ta bërë skriptin të ekzekutueshëm dhe çdo skript tjetër që kopjoni nga ky artikull. Thjesht zëvendësoni emrin e skriptit sa herë që përdorni komandën chmod
.
chmod +x word-list.sh
Le të ekzekutojmë skenarin.
./word-list.sh
Ashtu siç bëri me numrat, përsëritësi - në këtë shembull, ndryshorja fjala
- funksionon përmes listës së artikujve të të dhënave derisa të arrijë në fund të listës. Trupi i ciklit akseson vlerën në ndryshoren word
dhe kështu çdo fjalë në listë përpunohet.
për sythe me varg numrash
Nëse dëshironi që një cikli for
të ekzekutohej 100 herë, do të ishte një çështje mjaft e lodhshme të shkruani një sekuencë prej 100 numrash në kokën e ciklit. Gama e numrave ju lejojnë të specifikoni vetëm numrin e parë dhe të fundit.
Ky skenar është number-range.sh.
#!/bin/bash
for i in {1..10}
do
echo "Loop spin:" $i
done
Gama e numrave përcaktohet brenda kllapave kaçurrelë {}
me dy pika ..
që ndajnë numrat që fillojnë dhe përfundojnë diapazonin. Sigurohuni që të mos përfshini asnjë hapësirë të bardhë në përkufizimin e intervalit.
Kështu funksionon:
./number-range.sh
Ju mund të përfshini një numër tjetër që përcakton madhësinë e hapit që duhet të përdorë përsëritësi për të ecur nëpër numrat në interval. Ky skript, number-range2.sh do të përdorë një gamë nga 0 deri në 32 dhe një madhësi hapi prej 4.
#!/bin/bash
for i in {0..32..4}
do
echo "Loop spin:" $i
done
Përsëritësi kalon nëpër diapazonin e numrave në kërcime prej katër.
./number-range2.sh
për sythe duke përdorur emrat e skedarëve
Për shkak se ne mund të përpunojmë lista fjalësh, ne mund t'i bëjmë skriptet tona të punojnë me emrat e skedarëve. Ky skenar quhet filenames.sh.
#!/bin/bash
for file in word-list.sh number-range.sh number-range2.sh filenames.sh
do
ls -lh "$file"
done
Do të ishte shumë e kotë të kishim një skript që bën vetëm atë që mund të bëjë ls
, por tregon se si të aksesoni emrat e skedarëve brenda trupit të ciklit.
./filenames.sh
Në mënyrë të ngjashme me përdorimin e diapazonit të numrave, ne mund të përdorim një model skedari në kokën e ciklit për të specifikuar skedarët që duam të përpunojmë. Kjo shmang shumë shtypje dhe do të thotë që nuk kemi nevojë të dimë paraprakisht emrat e skedarëve.
Ky skript quhet filename2.sh. Ne e kemi zëvendësuar listën e emrave të skedarëve me modelin e emrit të skedarit *.sh për të pasur raportin e skriptit për të gjithë skedarët e skriptit në drejtorinë aktuale.
#!/bin/bash
for file in *.sh
do
ls -lh "$file"
done
Këtu është rezultati.
./filenames2.sh
për sythe duke përdorur parametrat e linjës së komandës
Mund të shtojmë më shumë fleksibilitet duke kaluar në modelin e emrit të skedarit në vijën e komandës. Ndryshorja $*
përfaqëson të gjithë parametrat e linjës së komandës që i kalohen skriptit.
Ky është filenames3.sh.
#!/bin/bash
for file in $*
do
ls -lh "$file"
done
Ne do të kërkojmë emrat e skedarëve që fillojnë me n dhe kanë një shtrirje SH.
./filenames3.sh n*.sh
Ne gjithashtu mund të kalojmë në më shumë se një model në të njëjtën kohë.
./filenames3.sh n*.sh .bashrc
Ndryshorja iterator file
merr vlerën e secilit prej parametrave të linjës së komandës. Modelet e emrave të skedarëve zgjerohen dhe të gjithë emrat e skedarëve përpunohen në trupin e ciklit.
C-si për sythe
Bash mbështet ciklin klasik me tre terma, siç janë ato që gjenden në gjuhën e programimit C. Ata quhen sythe me tre terma sepse ka tre terma në kokën e ciklit.
- Vlera fillestare e përsëritësit të ciklit.
- Testi nëse cikli vazhdon apo mbaron.
- Rritja ose zvogëlimi i përsëritësit.
Ky skenar është c-like.sh.
Përsëritësi I
është vendosur në 1 në fillim të ciklit, dhe cikli do të funksionojë për aq kohë sa deklarata i<=10
është e vërtetë. Sapo i
të arrijë 11, cikli për
do të ndalojë. Iteratori po rritet me një, çdo revolucion i ciklit.
#!/bin/bash
for (( i=1; i<=10; i++ ))
do
echo "Loop number:" $i
done
Le të ekzekutojmë këtë skenar.
./c-like.sh
Cikli i ngjashëm me C-në for
lejon krijimin e lehtë të sytheve for
që kanë kërkesa paksa të çuditshme. Ky cikli fillon në 15 dhe numëron mbrapsht në hapat 3. Ky është c-like2.sh
#!/bin/bash
for (( i=15; i>0; i-=3 ))
do
echo "Loop number:" $i
done
Kur e drejtojmë, duhet të kërcejë prapa në hapa tre.
./c-like2.sh
Infinite për sythe
Ju gjithashtu mund të përdorni këtë format të ciklit for
për të krijuar një lak të pafund. E tëra çfarë ju duhet të bëni është të hiqni të gjithë elementët nga kreu i ciklit, si kjo. Kjo është infinite.sh.
#!/bin/bash
for (( ; ; ))
do
echo "Press Ctrl+C to stop..."
sleep 1
done
Ju do të duhet të shtypni Ctrl + C për të ndaluar ciklin.
./infinite.sh
për sythe duke përdorur vargje të fjalëve
Ne mund të përsërisim lehtësisht përmes një sërë fjalësh. Ne duhet të japim emrin e grupit në kokën e ciklit, dhe përsëritësi do të kalojë nëpër të gjitha hyrjet në grup. Ky është word-array.sh.
#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributions
do
echo $distro
done
Të gjitha shpërndarjet janë të listuara për ne.
./word-array.sh
Komanda për vazhdim
Nëse dëshironi që cikli të kalojë mbi një hyrje të caktuar, provoni nëse përsëritësi përputhet me atë hyrje dhe përdorni komandën vazhdoni
. Komanda vazhdoni
braktis rrotullimin aktuale të ciklit. Ai rrit përsëritësin dhe fillon rrotullimin tjetër të ciklit - duke supozuar se hyrja që dëshironi të kapërceni nuk është artikulli i fundit në listë.
Ky është word-array2.sh. Ai kalon mbi hyrjen e grupit Arch, por përpunon të gjithë anëtarët e tjerë të grupit.
#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributions
do
if [[ "$distro" == "Arch" ]] ;
then
continue
fi
echo $distro
done
Arch nuk shfaqet në dritaren e terminalit.
./word-array2.sh
Komanda e pushimit
Komanda break
del jashtë ciklit dhe parandalon çdo përpunim të mëtejshëm.
Ky është word-array3.sh. Është i njëjtë me skriptin e mëparshëm me vazhdim
i zëvendësuar nga break
.
#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributions
do
if [[ "$distro" == "Arch" ]] ;
then
break
fi
echo $distro
done
Kur përsëritësi përmban Arch, cikli for braktis çdo proces tjetër.
./word-array3.sh
për sythe duke përdorur vargje asociative
Në Bash 4 dhe më lart, grupet shoqëruese ju lejojnë të krijoni lista të çifteve çelës-vlerë që mund të kërkohen nga çelësi ose nga vlera. Për shkak të marrëdhënies së dyanshme midis çelësit dhe vlerës, ata quhen gjithashtu fjalorë të të dhënave.
Ne mund të përsërisim përmes një grupi shoqërues duke përdorur një cikli për
. Ky skenar është associative.sh. Ai përcakton një grup shoqërues me katër hyrje në të, një për secilën prej qen, mace, robin dhe njeri. Këta janë çelësat. Vlerat janë numri (i parazgjedhur) i këmbëve që ka secila.
#!/bin/bash
declare -A animals=( [dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged )
for legs in ${!animals[@]}
do
if [ ${animals[$legs]} == "Two-legged" ]; then
echo ${legs}
fi
done
Iteratori quhet këmbët
. Vini re se kreu i lakut përmban një pikëçuditëse !
. Ky nuk po vepron si operatori logjik NOT, është pjesë e sintaksës së grupit shoqërues. Kërkohet përmes grupit.
Trupi i lakut kryen një test krahasimi të vargjeve. Nëse vlera e anëtarit të grupit është me dy këmbë, ai printon vlerën kryesore në dritaren e terminalit. Kur e ekzekutojmë, skripti printon krijesat me dy këmbë.
./associative.sh
Përsëritja gjatë prodhimit të komandave
Nëse keni një komandë ose sekuencë komandash që prodhojnë një listë të diçkaje, të tilla si emrat e skedarëve, mund t'i përsërisni ato me një lak për
. Duhet të keni kujdes për zgjerime të papritura të emrit të skedarit, por në raste të thjeshta është mirë.
Ky skenar është command.sh. ai përdor ls
dhe wc
për të ofruar një listë të renditur të emrave të skedarëve të skriptit, së bashku me numrin e tyre të rreshtave, fjalëve dhe bajteve.
#!/bin/bash
for i in $(ls *.sh | sort);
do
echo $(wc $i)
done
Kur e ekzekutojmë, marrim statistikat për çdo skedar, me skedarët e renditur sipas rendit alfabetik.
./command.sh
Dazzling for Loop
Cikli for
është një mjet skriptimi i gjithanshëm dhe lehtësisht i kuptueshëm. Por sado fleksibël që është, mos harroni se sythe të tjera ekzistojnë për një arsye. Mos u mahnitni duke menduar se cikli for
është gjithçka që do t'ju nevojitet ndonjëherë.
Cikli while
, për shembull, është shumë më i përshtatshëm për gjëra të caktuara sesa cikli for
, si p.sh. leximi i rreshtave nga një skedar.
Të shkruash skenarë të mirë do të thotë të përdorësh mjetin më të përshtatshëm për detyrën në fjalë. Cikli for
është një mjet i shkëlqyeshëm për ta pasur në kutinë e veglave të mashtrimeve.