Све што требате знати о Басх Фор Лоопс у Линуку

Све што требате знати о Басх Фор Лоопс у Линуку

Басх скрипте су високо ефикасно средство за аутоматизацију задатака, посебно оних који користе друге постојеће програме. Ова аутоматизација често захтева понављање сличне операције неколико пута, што је управо место где се фор лооп долази на своје.





Администратори система Линук и Мац обично су упознати са скриптирањем путем терминала, али чак и корисници Виндовса могу крените у акцију помоћу Виндовс подсистема за Линук .





Како раде Басх скрипте

Басх скрипта је једноставно обична текстуална датотека која садржи низ наредби које басх љуска може читати и извршавати. Басх је подразумевана љуска у пре-Цаталина мацОС-у и већини Линук дистрибуција.





Ако никада раније нисте радили са схелл скриптом, требали бисте почети са апсолутно најједноставнијим случајем. Ово ће вам омогућити да вежбате кључне концепте, укључујући креирање скрипте и њено извршавање.

Прво креирајте следећу датотеку на погодној локацији (идеално је да отворите терминал и прво идите до жељеног директоријума):



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

Прва линија говори оном што покреће овај програм како да га покрене (тј. Помоћу басх тумача). Друга је само команда коју можете унети у командну линију. Сачувајте ту датотеку као хелло_ворлд.сх , онда:

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

Тхе цхмод команда у првом реду чини датотеку извршном, што значи да се може покренути уписивањем њеног имена, као у другом реду.





Ако видите речи Хелло, Ворлд се појављују одштампане на линији на вашем терминалу, онда све ради како је потребно.

Како функционишу петље

У општем програмирању постоје две главне врсте фор петље: нумерички и за сваки . Нумерички тип је традиционално најчешћи, али у басх употреби обично је обрнуто.





Нумерички за петље се обично фокусирају на један цео број који одређује колико ће се итерација извести, на пример:

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

Ово је позната петља која ће понављати тачно 100 пута, осим ако се и не промени унутар петље, или друга наредба изазове заустављање извршавања фор петље.

Фореацх петље, за разлику од тога, имају тенденцију да раде на структурама као што су листе или низови и понављају за сваку ставку у тој колекцији:

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

Неки језици користе нешто другачију синтаксу која мења редослед прикупљања и ставки:

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

За у петљама

У басх, фореацх - или за у - петља је чешћа. Основна синтакса је, једноставно:

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

На пример, за понављање кроз три датотеке са експлицитним именом:

како да сазнате ко вас је бесплатно позвао
for file in one.c two.c three.c
do
ls '$file'
done

Ако такве датотеке постоје у тренутном директорију, излаз из ове скрипте ће бити:

one.c
two.c
three.c

Уместо фиксног скупа датотека, листа се може добити путем глоб обрасца (један који укључује џокере - посебне знакове који представљају друге знакове). У следећем примеру, петља фор понавља све датотеке (у тренутном директоријуму) чија имена завршавају на '.кмл':

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

Ево неколико примера излаза:

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

Ово може веома личити на дуготрајан начин рада:

$ ls -l *.xml

Али постоји значајна разлика: фор петља извршава лс програм 2 различита пута, при чему му се сваки пут преноси једно име датотеке. У засебном примеру лс, глоб узорак (*.кмл) прво одговара именима датотека, а затим их све шаље, као појединачне параметре командне линије, у једну инстанцу лс .

Ево примера који користи Тоалет (бројање речи) програм како би разлика била очигледнија:

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

Тхе Тоалет програм броји број редова у свакој датотеци засебно, а затим штампа укупан број свих њих. Насупрот томе, ако Тоалет ради у оквиру фор петље:

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

И даље ћете видети број за сваку датотеку:

44 feed.xml
231 sitemap.xml

Али не постоји укупан збирни збир јер Тоалет се изводи изоловано, сваки пут када петља понавља.

Када листа није листа

Постоји врло лака и честа грешка при бављењу фор петљама, због начина на који басх рукује цитираним аргументима/низовима. Прелиставање листе датотека треба да се уради овако:

for file in one.c two.c

Не свиђа ми се ово:

for file in 'one.c two.c'

Други пример обухвата имена датотека у двоструким наводницима што резултира листом са само једним параметром; фор петља ће се извршити само једном. Овај проблем се може избећи употребом променљиве у таквим случајевима:

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

Имајте на уму да сама декларација променљиве мора ставити своју вредност у двоструке наводнике!

како знате да вас је неко блокирао на снапцхату

За Без листе

Без ичега за понављање, фор петља ради на било којим аргументима из командне линије који су скрипти дати при позивању. На пример, ако имате скрипту под именом аргс.сх који садржи следеће:

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

Извођење аргс.сх ће вам дати следеће:

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

Басх препознаје овај случај и третира га за до као еквивалент од за у $@ до где је $@ посебна променљива која представља аргументе командне линије.

Опонашање традиционалног нумеричког за петљу

Басх скрипте се често баве списковима датотека или линијама исписа из других команди, па је тип ин фор петље уобичајен. Међутим, традиционална операција у стилу ц је и даље подржана:

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

Ово је класичан облик са три дела у којима:

  1. променљива се иницијализује (и = 1) када се петља први пут сретне
  2. петља се наставља све док услов (тј<=5) is true
  3. сваки пут око петље, променљива се повећава (и ++)

Итерација између две вредности је довољно уобичајен захтев да постоји краћа, мало мање збуњујућа алтернатива:

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

Експанзија заграде која се одвија ефикасно преводи горњу фор петљу у:

for i in 1 2 3 4

Финер Лооп Цонтрол витх Бреак анд Цонтинуе

Сложеније за петље често је потребан начин за рани излаз или одмах поновно покретање главне петље са следећом вредношћу. Да бисте то урадили, басх позајмљује наредбе бреак и цонтинуе које су уобичајене у другим програмским језицима. Ево примера који користи оба за проналажење прве датотеке која има више од 100 знакова:

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

Фор петља овде ради на свим датотекама у тренутном директоријуму. Ако датотека није обична датотека (нпр. Ако је директоријум), наредба цонтинуе се користи за поновно покретање петље са следећом датотеком. Ако је то обична датотека, други условни блок ће утврдити да ли садржи више од 100 знакова. Ако је тако, наредба бреак се користи за тренутно напуштање фор петље (и достизање краја скрипте).

Закључак

Басх скрипта је датотека која садржи скуп инструкција које се могу извршити. Фор петља омогућава да се део скрипте понавља више пута. Коришћењем променљивих, спољних команди и наредби бреак анд цонтинуе, басх скрипте могу применити сложенију логику и извршити широк спектар задатака.

Објави Објави Твеет Емаил Да ли је вредно надоградње на Виндовс 11?

Виндовс је редизајниран. Али да ли је то довољно да вас убеди да пређете са Виндовс 10 на Виндовс 11?

Прочитајте следеће
Повезане теме
  • Програмирање
  • Линук
О аутору Бобби Јацк(Објављено 58 чланака)

Бобби је ентузијаст технологије који је скоро две деценије радио као програмер софтвера. Одушевљен је играњем игара, ради као уредник рецензија у магазину Свитцх Плаиер, и уроњен је у све аспекте издаваштва на мрежи и веб развоја.

Више од Боббија Јацка

Претплатите се на наш билтен

Придружите се нашем билтену за техничке савете, критике, бесплатне е -књиге и ексклузивне понуде!

Кликните овде да бисте се претплатили