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.