Циклите са мощна функция във всеки език за програмиране. Ако вече не знаете, циклите са начин да повторите кода въз основа на определени критерии.
Например, представете си, че трябва да отпечатате числата от 1 до 10. Можете да напишете командата echo десет пъти, но това е много примитивно. Използвате цикъл и в 3-4 реда код може да стане.
Това е най-простият от примерите, за които се сещам. Ще споделя реални полезни примери, докато обсъждам bash циклите с вас.
В Bash има три вида цикли:
Ще покажа и трите вида зацикляне в урока. Нека започнем с най-често срещания.
За цикъл в bash
Ето синтаксиса за ‘for цикъл’ в bash:
for arg in LIST; do
commands
done
СПИСЪКЪТ тук може да бъде масив или списък от елементи. Разширенията на скоби също са популярни за зацикляне.
Вземете най-простия сценарий, който споменах в началото. Нека отпечатаме числата от 1 до 10 с помощта на цикъл for:
#!/bin/bash
for num in {1..10}; do
echo $num
done
Ако го стартирате, трябва да видите резултат като този:
abhi[email protected]:~/bash_scripts$ ./for-loop.sh
1
2
3
4
5
6
7
8
9
10
Можеше също да използваш for num in 1 2 3 4 5 6 7 8 9 10; do
но използването на скоби прави кода да изглежда по-кратък и по-умен.
{..}
се използва за разширяване на модел. Ти използваш {d..h}
и е еквивалентно на d e f g h
. Повече за разширяването на скоби можете да намерите в тази статия.
Използване на Brace Expansion в Bash Shell
Разширяването на скоби в bash shell е по-малко известна, но страхотна функция. Научете как да ги използвате като потребител на Pro Linux с практически примери.
💡
за ((i = 0; i < 10; i++)); направи
ехо $i
Свършен
Нека видим друг пример, който показва цялото съдържание на масив в bash:
#!/bin/bash
distros=(Ubuntu Fedora Debian Alpine)
for i in "${distros[@]}"; do
echo $i
done
Ако стартирате скрипта, той ще покаже всички дистрибуции, дефинирани в масива:
Ubuntu
Fedora
Debian
Alpine
Докато цикъл в bash
Цикълът while тества условие и след това продължава цикъла, докато условието е вярно.
while [ condition ]; do
commands
done
Ако вземете предишния пример, той може да бъде пренаписан с помощта на цикъла while по следния начин:
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $num
num=$(($num+1))
done
Както можете да видите, трябваше да дефинирате променливата num
първо на 1 и след това в тялото на цикъла увеличавате стойността на num
от 1. Цикълът while проверява условието и го изпълнява, докато num
е по-малко или равно на 10.
По този начин, стартирането на скрипта сега ще покаже точния резултат, който видяхте по-рано с for цикъла.
1
2
3
4
5
6
7
8
9
10
Да видим друг пример. Ето един bash скрипт, който приема число като аргумент и показва неговата таблица.
#!/bin/bash
echo "Table for $1 is:"
index=1
while [ $index -le 10 ]; do
echo $(($1*$index))
index=$(($index+1))
done
Ако сте объркани относно използването на $1, той представлява първия аргумент, предаден на скрипта. Вижте глава 3 от тази серия за повече подробности.
Ако стартирате скрипта, той трябва да покаже този резултат:
[email protected]:~/bash_scripts$ ./table.sh 2
Table for 2 is:
2
4
6
8
10
12
14
16
18
20
До цикъл в bash
Това е по-рядко използваният loop формат. Той се държи подобно на цикъла while. Разликата тук е, че цикълът работи, докато условието, което проверява, е невярно. Ще го обясня след малко. Нека първо видим неговия синтаксис.
until [ condition ]; do
commands
done
Сега, ако трябва да използвам същия пример за отпечатване на числа от 1 до 10 с помощта на цикъла unless, ще изглежда така:
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $num
num=$(($num+1))
done
Разликата е в състоянието; останалото си остава същото.
- Цикълът while се изпълнява, докато променливата
num
беше по-малко или равно на 10. - Цикълът до се изпълнява до променливата
num
става по-голямо от 10.
И двата са различни начини да направите едно и също нещо. While е по-популярен, тъй като ще намерите еквивалент на цикъл while в повечето езици за програмиране.
🏋️ Време за упражнения
Това беше забавно. Сега е време да направите малко упражнения.
Упражнение 1: Напишете скрипт, който приема число като аргумент и отпечатва неговата таблица. Вашият скрипт трябва също да показва съобщение, ако скриптът се изпълнява без аргумент.
Очакван резултат:
$: ./table.sh
You forgot to enter a number
$: ./table.sh 3
3
6
9
12
15
18
21
24
27
30
Упражнение 2: Напишете скрипт, който изброява всички файлове в директорията /var
Подсказка: Използвайте for цикъл с /var/* като ‘списък’.
Можете да обсъдите отговорите си в тази специална тема в Общността:
Практическо упражнение в Bash Basics Series #8: цикли For, While и Until
Ако следвате поредицата Bash Basics на It’s FOSS, можете да изпратите и обсъдите отговорите на упражнението в края на главата: Колегите с опит се насърчават да предоставят своите отзиви на новите членове. Обърнете внимание, че може да има повече от един отговор на даден проблем.

Поредицата Bash Bass е към своя край. Като последна глава от поредицата, следващата седмица ще се научите да използвате функции в bash скриптове. Останете на линия.
Публикациите се превеждат автоматично с google translate