Цикли For, While и Until

Сподели

Циклите са мощна функция във всеки език за програмиране. Ако вече не знаете, циклите са начин да повторите кода въз основа на определени критерии.

Например, представете си, че трябва да отпечатате числата от 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 с практически примери.

💡

Ако сте запознати с програмирането на C, може да ви хареса използването на C-стил for цикли в bash:

за ((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 скриптове. Останете на линия.

Източник: itsfoss.com

Публикациите се превеждат автоматично с google translate

Loading


Сподели