Всичко, което трябва да знаете за Bash For Loops в Linux

Всичко, което трябва да знаете за Bash For Loops в Linux

Баш скриптовете са високоефективно средство за автоматизиране на задачи, особено тези, които се възползват от други съществуващи програми. Тази автоматизация често изисква повтаряне на подобна операция няколко пъти, което е точно мястото, където for цикъл влиза в своето.





Системните администратори на Linux и Mac обикновено са запознати със скриптовете чрез терминала, но дори потребителите на Windows могат влезте в действието с подсистемата Windows за Linux .





Как работят скриптовете на Bash

Bash скрипт е просто обикновен текстов файл, съдържащ поредица от команди, които bash черупката може да чете и изпълнява. Bash е черупката по подразбиране в macOS преди Catalina и повечето дистрибуции на Linux.





Ако никога преди не сте работили с скрипт на обвивката, трябва да започнете с най -простия случай. Това ще ви позволи да практикувате ключови концепции, включително създаването на скрипта и неговото изпълнение.

Първо създайте следния файл на удобно място (в идеалния случай отворете терминал и първо отидете до желаната директория):



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

Първият ред казва каквото и да изпълнява тази програма как да го стартира (т.е. използвайки bash интерпретатора). Второто е просто команда като всяка друга, която можете да въведете в командния ред. Запазете този файл като hello_world.sh , тогава:

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

The chmod команда на първия ред прави файла изпълним, което означава, че той може да се изпълнява чрез въвеждане на името му, както във втория ред.





Ако видите думите Hello, World се появяват отпечатани на ред във вашия терминал, тогава всичко работи според изискванията.

Как работят цикли

В общото програмиране има два основни типа for цикъл: числово и за всеки . Числовият тип традиционно е най -често срещаният, но при използването на bash обикновено е обратното.





Числовите за цикли обикновено се фокусират върху едно цяло число, което определя колко итерации ще бъдат извършени, например:

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

Това е познат за търсене цикъл, който ще повтори точно 100 пъти, освен ако i не е променен в цикъла, или друго изявление води до спиране на изпълнението на цикъла for.

Обратно, циклите на Foreach са склонни да работят върху структури като списъци или масиви и да правят повторения за всеки елемент в тази колекция:

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

Някои езици използват малко по -различен синтаксис, който разменя реда на събиране и елемент:

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

За в цикли

В bash, foreach - или за в - цикълът е по -често срещан. Основният синтаксис е просто:

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 се повтаря във всички файлове (в текущата директория), чиито имена завършват на '.xml':

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

Но има съществена разлика: цикълът for изпълнява ls програма 2 отделни пъти, като всеки път се предава по едно име на файл. В отделния пример за ls, глобалният модел (*.xml) първо съвпада с имената на файловете и след това изпраща всички тях като отделни параметри на командния ред до един екземпляр на ls .

Ето пример, който използва тоалетна (брой думи) програма, за да направи разликата по -очевидна:

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

The тоалетна програмата брои броя редове във всеки файл поотделно, след което отпечатва общ брой за всички тях. За разлика от това, ако тоалетна работи в рамките на цикъл for:

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

Все още ще виждате броя на всеки файл:

44 feed.xml
231 sitemap.xml

Но няма обща обобщена сума, защото тоалетна се изпълнява изолирано, всеки път, когато цикълът се повтаря.

Когато списък не е списък

Има много лесна и често срещана грешка при справяне с цикли, поради начина, по който bash обработва цитирани аргументи/низове. Преглеждането на списък с файлове трябва да стане по следния начин:

for file in one.c two.c

Не така:

for file in 'one.c two.c'

Вторият пример включва имена на файлове в двойни кавички, което води до списък само с един параметър; цикълът for ще се изпълнява само веднъж. Този проблем може да бъде избегнат чрез използване на променлива в такива случаи:

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

Имайте предвид, че самата декларация на променливата трябва да включва стойността си в двойни кавички!

как да вдигнете ръка при мащабиране

За Без списък

Без нищо за повторение, цикълът for работи върху всички аргументи от командния ред, предоставени на скрипта при извикване. Например, ако имате скрипт с име args.sh съдържащи следното:

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

След това изпълнението на args.sh ще ви даде следното:

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

Баш разпознава този случай и третира за едно дело като еквивалент на за $@ do където $@ е специална променлива, представляваща аргументи на командния ред.

Имулиране на традиционна цифра за цикъл

Баш скриптовете често се занимават със списъци с файлове или редове на изход от други команди, така че цикълът for in е често срещан. Въпреки това традиционната операция в стил c все още се поддържа:

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

Това е класическата форма с три части, в които:

  1. променлива се инициализира (i = 1), когато цикълът се срещне за първи път
  2. цикълът продължава, докато условието (т.е.<=5) is true
  3. всеки път около цикъла променливата се увеличава (i ++)

Итерацията между две стойности е достатъчно често срещано изискване, че има по -кратка, малко по -малко объркваща алтернатива:

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

Разширяването на скобите, което се извършва ефективно, превежда горното for цикъл в:

for i in 1 2 3 4

По -фин контрол на контура с прекъсване и продължаване

По -сложните за цикли често се нуждаят от начин за излизане от началото или незабавно рестартиране на основния цикъл със следващата стойност на свой ред. За да направите това, bash заема инструкциите break и continue, които са често срещани в други езици за програмиране. Ето пример, който използва и двете, за да намери първия файл с дължина над 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

Цикълът for работи тук върху всички файлове в текущата директория. Ако файлът не е обикновен файл (например ако е директория), инструкцията continue се използва за рестартиране на цикъла със следващия файл на свой ред. Ако това е обикновен файл, вторият условен блок ще определи дали съдържа повече от 100 знака. Ако е така, операторът break се използва за незабавно напускане на цикъла for (и достигане до края на скрипта).

Заключение

Баш скрипт е файл, съдържащ набор от инструкции, които могат да бъдат изпълнени. Цикълът for позволява да се повтори част от скрипта много пъти. С използването на променливи, външни команди и инструкции break и continue, скриптове за bash могат да прилагат по -сложна логика и да изпълняват широк спектър от задачи.

Дял Дял Туит електронна поща Струва ли си да надстроите до Windows 11?

Windows е преработен. Но достатъчно ли е това, за да ви убеди да преминете от Windows 10 към Windows 11?

Прочетете Напред
Свързани теми
  • Програмиране
  • Linux
За автора Боби Джак(58 статии са публикувани)

Боби е ентусиаст на технологиите, който работи като софтуерен разработчик в продължение на почти две десетилетия. Той е запален по игрите, работи като редактор на рецензии в Switch Player Magazine и е потопен във всички аспекти на онлайн издателството и уеб разработката.

Още от Боби Джак

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате