Lahat ng Kailangan Mong Malaman Tungkol sa Bash For Loops sa Linux

Lahat ng Kailangan Mong Malaman Tungkol sa Bash For Loops sa Linux

Ang mga script ng Bash ay isang mahusay na paraan ng pag-automate ng mga gawain, partikular ang mga nagsasamantala sa iba pang mga mayroon nang mga programa. Ang pag-aautomat na ito ay madalas na nangangailangan ng paulit-ulit na isang katulad na operasyon nang maraming beses, na kung saan ay eksaktong kung saan ang para sa loop nagmumula sa sarili nitong.





Ang mga administrator ng system ng Linux at Mac ay karaniwang pamilyar sa pag-script sa pamamagitan ng terminal, ngunit kahit na ang mga gumagamit ng Windows ay maaari makapasok sa aksyon gamit ang Windows Subsystem para sa Linux .





Paano Gumagana ang Mga Bash Script

Ang isang bash script ay isang simpleng text file na naglalaman ng isang serye ng mga utos na maaaring basahin at maisagawa ng bash shell. Ang Bash ay ang default na shell sa pre-Catalina macOS, at karamihan sa mga pamamahagi ng Linux.





Kung hindi ka pa nagtrabaho kasama ang isang shell script dati, dapat kang magsimula sa ganap na pinakasimpleng kaso. Papayagan ka nitong magsanay ng mga pangunahing konsepto kabilang ang paglikha ng script at pagpapatupad nito.

Una, lumikha ng sumusunod na file sa isang maginhawang lokasyon (perpekto, buksan ang isang terminal at mag-navigate muna sa nais na direktoryo):



#!/bin/bash
echo 'Hello, World'

Sinasabi ng unang linya kung ano man ang nagpapatakbo ng program na ito kung paano ito patakbuhin (ibig sabihin, gamit ang bash interpreter). Ang pangalawa ay isang utos tulad ng anumang iba pang maaari mong ipasok sa linya ng utos. I-save ang file na iyon bilang hello_world.sh , kung gayon:

$ chmod +x hello_world.sh
$ ./hello_world.sh

Ang chmod Ang utos sa unang linya ay ginagawang maipapatupad ang file, nangangahulugang maaari itong patakbuhin sa pamamagitan ng pagta-type ng pangalan nito, tulad ng sa pangalawang linya.





Kung nakikita mo ang mga salitang Hello, Lumilitaw ang mundo na nakalimbag sa isang linya sa iyong terminal, kung gayon gumagana ang lahat ayon sa kinakailangan.

Paano Gumagana ang Loops

Sa pangkalahatang programa, mayroong dalawang pangunahing uri ng para sa loop: bilang at unahan . Ang uri ng bilang ay ayon sa kaugalian na pinaka-karaniwan, ngunit sa pag-bash ng paggamit, karaniwang ito ay iba pang paraan.





Ang numeric para sa mga loop ay karaniwang nakatuon sa isang solong integer na tumutukoy kung gaano karaming mga pag-ulit ang isasagawa, halimbawa:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Ito ay isang pamilyar na paghahanap para sa loop na magpapasulit nang eksaktong 100 beses, maliban kung binago ako sa loob ng loop, o ibang pahayag na sanhi ng pagpapatupad ng para sa loop upang tumigil.

Ang mga loop ng Foreach, sa kaibahan, ay may posibilidad na mapatakbo sa mga istraktura tulad ng mga listahan o array, at umulit para sa bawat item sa loob ng koleksyon na iyon:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Ang ilang mga wika ay gumagamit ng isang bahagyang iba't ibang mga syntax na nagpapalit ng pagkakasunud-sunod ng koleksyon at item:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

Para sa Loops

Sa bash, ang unahan — o para sa —Loop ay mas karaniwan. Ang pangunahing syntax ay, simpleng:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

Halimbawa, upang paulitin sa pamamagitan ng tatlong malinaw na pinangalanang mga file:

kung paano gumawa ng isang larawan 1920x1080
for file in one.c two.c three.c
do
ls '$file'
done

Kung ang mga naturang file ay umiiral sa kasalukuyang direktoryo, ang output mula sa script na ito ay:

one.c
two.c
three.c

Sa halip na isang nakapirming hanay ng mga file, ang listahan ay maaaring makuha sa pamamagitan ng isang pattern ng glob (isa kasama ang mga wildcard - mga espesyal na character na kumakatawan sa iba pang mga character). Sa sumusunod na halimbawa, ang para sa loop ay umuulit sa lahat ng mga file (sa kasalukuyang direktoryo) na ang mga pangalan ay nagtatapos sa '.xml':

for file in *.xml
do
ls -l '$file'
done

Narito ang ilang halimbawang output:

$ -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

Maaari itong magmukhang katulad ng isang matagal nang paraan ng paggawa:

$ ls -l *.xml

Ngunit mayroong isang makabuluhang pagkakaiba: ang para sa loop ay nagpapatupad ng ls program 2 magkakahiwalay na oras, na may isang solong filename na ipinapasa dito sa bawat oras. Sa magkakahiwalay na halimbawa ng ls, ang pattern ng glob (* .xml) ay tumutugma muna sa mga filename at pagkatapos ay ipapadala ang lahat sa kanila, bilang indibidwal na mga parameter ng linya ng utos, sa isang halimbawa ng ls .

Narito ang isang halimbawa na gumagamit ng wc (Bilang ng salita) na programa upang gawing mas halata ang pagkakaiba:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

Ang wc Binibilang ng programa ang bilang ng mga linya sa bawat file nang magkahiwalay, pagkatapos ay i-print ang isang kabuuang bilang sa lahat ng mga ito. Sa kaibahan, kung wc nagpapatakbo sa loob ng para sa loop:

for file in *.xml
do
wc -l $file
done

Makikita mo pa rin ang bilang para sa bawat file:

44 feed.xml
231 sitemap.xml

Ngunit walang pangkalahatang kabuuan ng buod dahil wc ay tumatakbo nang nakahiwalay, sa tuwing umuulit ang loop.

Kapag ang Lista ay Hindi Listahan

Mayroong isang napakadali at karaniwang pagkakamali kapag nakikipag-usap para sa mga loop, dahil sa paraan ng paghawak ng bash na naka-quote ng mga argumento / string. Ang pag-loop sa isang listahan ng mga file ay dapat gawin tulad nito:

for file in one.c two.c

Hindi ganito:

for file in 'one.c two.c'

Ang pangalawang halimbawa ay nagsasara ng mga filename sa mga dobleng quote na nagreresulta sa isang listahan na may isang solong parameter lamang; ang for loop ay papatayin lamang ng isang beses. Maiiwasan ang problemang ito sa pamamagitan ng paggamit ng variable sa mga ganitong kaso:

FILES='one.c two.c'
for file in $FILES
do
...
done

Tandaan na ang variable na deklarasyon mismo ay kailangang isara ang halaga nito sa mga dobleng quote!

kung paano ikonekta ang telepono sa tv sa usb

Para Walang Listahan

Walang anuman upang umulit, ang isang para sa loop ay nagpapatakbo sa anumang mga argumento ng linya ng utos na ibinigay sa script kapag tinawag. Halimbawa, kung mayroon kang isang script na pinangalanan args.sh naglalaman ng mga sumusunod:

#!/bin/sh
for a
do
echo $a
done

Pagkatapos ay ang pagpapatupad ng args.sh ay magbibigay sa iyo ng mga sumusunod:

$ ./args.sh one two three
one
two
three

Kinikilala ni Bash ang kasong ito at itinatrato para sa isang gawin bilang katumbas ng para sa isang $ @ do kung saan ang $ @ ay isang espesyal na variable na kumakatawan sa mga argumento ng command-line.

Paggaya ng isang Tradisyunal na Numeric Para sa Loop

Ang mga script ng Bash ay madalas na makitungo sa mga listahan ng mga file o linya ng output mula sa iba pang mga utos, kaya ang para sa uri ng loop ay karaniwan. Gayunpaman, suportado pa rin ang tradisyonal na pagpapatakbo ng istilong c:

for (( i=1; i<=5; i++ ))
do
echo $i
done

Ito ang klasikong form na may tatlong bahagi kung saan:

  1. ang isang variable ay pinasimulan (i = 1) kapag ang loop ay unang nakatagpo
  2. ang loop ay nagpapatuloy hangga't ang kondisyon (i<=5) is true
  3. sa bawat oras sa paligid ng loop, ang variable ay nadagdagan (i ++)

Ang pag-iter sa pagitan ng dalawang halaga ay isang pangkaraniwang sapat na kinakailangan na mayroong isang mas maikli, bahagyang hindi gaanong nakalilito na kahalili:

for i in {1..5}
do
echo $i
done

Ang pagpapalawak ng brace na nagaganap na mabisang isinasalin sa itaas para sa loop sa:

for i in 1 2 3 4

Finer Loop Control Sa Break at Magpatuloy

Ang mas kumplikado para sa mga loop ay madalas na nangangailangan ng isang paraan ng paglabas ng maaga o agad na pag-restart ng pangunahing loop na may susunod na halaga. Upang magawa ito, hinihiram ng bash ang pahinga at ipagpatuloy ang mga pahayag na karaniwan sa iba pang mga wika sa pagprograma. Narito ang isang halimbawa na gumagamit ng pareho upang hanapin ang unang file na higit sa 100 mga character ang haba:

#!/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

Ang para sa loop dito ay nagpapatakbo sa lahat ng mga file sa kasalukuyang direktoryo. Kung ang file ay hindi isang regular na file (hal. Kung ito ay isang direktoryo), ginagamit ang pagpapatuloy na pahayag upang i-restart ang loop kasama ang susunod na file sa pagliko. Kung ito ay isang regular na file, matutukoy ng pangalawang kondisyunal na bloke kung naglalaman ito ng higit sa 100 mga character. Kung gayon, ginagamit ang pahayag ng pahinga upang agad na iwanan ang para sa loop (at maabot ang dulo ng script).

Konklusyon

Ang isang bash script ay isang file na naglalaman ng isang hanay ng mga tagubilin na maaaring maipatupad. Pinapayagan ng A para sa loop ang bahagi ng isang script na ulitin nang maraming beses. Gamit ang paggamit ng mga variable, panlabas na utos, at ang pahinga at magpatuloy sa mga pahayag, ang mga script ng bash ay maaaring maglapat ng mas kumplikadong lohika at isakatuparan ang isang malawak na hanay ng mga gawain.

Magbahagi Magbahagi Mag-tweet Email Ito ba ay Worth Upgrading sa Windows 11?

Ang Windows ay muling idisenyo. Ngunit sapat na ba iyon upang kumbinsihin kang lumipat mula sa Windows 10 patungong Windows 11?

Basahin Susunod
Mga Kaugnay na Paksa
  • Programming
  • Linux
Tungkol sa May-akda Bobby Jack(58 Mga Artikulo Na-publish)

Si Bobby ay isang mahilig sa teknolohiya na nagtrabaho bilang isang developer ng software sa loob ng halos dalawang dekada. Masigasig siya sa paglalaro, nagtatrabaho bilang Review Editor sa Switch Player Magazine, at nahuhulog sa lahat ng aspeto ng online na pag-publish at pag-unlad sa web.

Higit pa Mula kay Bobby Jack

Mag-subscribe sa aming newsletter

Sumali sa aming newsletter para sa mga tip sa tech, pagsusuri, libreng ebook, at eksklusibong deal!

Mag-click dito upang mag-subscribe