Bash - цикли¶
Цілі: В цьому розділі ви дізнаєтеся як:
використання циклів;
linux, сценарій, bash, цикли
Знання:
Складність:
Час читання: 20 хвилин
Оболонка bash дозволяє використовувати цикли. Ці структури дозволяють виконувати блок команд кілька разів (від 0 до нескінченності) відповідно до статично визначеного значення, динамічно або за умови:
whileuntilforselect
Незалежно від того, який цикл використовувався, команди, які потрібно повторити, розміщуються між словами do та done.
Структура умовного циклу while¶
Структура while / do / done обчислює команду, розміщену після while.
Якщо ця команда має значення true ($? = 0), виконуються команди, розміщені між do та done. Потім сценарій повертається до початку, щоб знову оцінити команду.
Коли оцінена команда має значення хибності ($? != 0), оболонка відновлює виконання скрипта після першої команди після завершення.
Синтаксис структури умовного циклу while:
while command
do
command if $? = 0
done
Приклад використання умовної структури while:
while [[ -e /etc/passwd ]]
do
echo "The file exists"
done
Якщо оцінювана команда не змінюється, цикл буде нескінченним і оболонка ніколи не виконає команди, розміщені після сценарію. Це може бути навмисно, але це також може бути помилка. Тож вам потрібно бути дуже обережними з командами, які керують циклом, і знайти спосіб вийти з нього.
Щоб вийти з циклу while, ви повинні переконатися, що команда, яка оцінюється, більше не є істинною, що не завжди можливо.
Існують команди, які дозволяють змінювати поведінку циклу:
exitbreakcontinue
Команда exit¶
Команда exit завершує виконання сценарію.
Синтаксис команди exit:
exit [n]
Приклад використання команди exit:
bash # to avoid being disconnected after the "exit 1
exit 1
echo $?
1
Команда exit негайно завершує роботу скрипта. Код повернення скрипта можна вказати, надавши його як аргумент (від 0 до 255).
Якщо аргумент не надано, код повернення останньої команди скрипта буде передано змінній $?.
Команди break / continue¶
Команда break дозволяє перервати цикл, перейшовши до першої команди після done.
Команда continue дозволяє перезапустити цикл, повернувшись до першої команди після done.
while [[ -d / ]] INT ✘ 17s
do
echo "Do you want to continue? (yes/no)"
read ans
[[ $ans = "yes" ]] && continue
[[ $ans = "no" ]] && break
done
Команди true / false¶
Команда true завжди повертає true, тоді як команда false завжди повертає false.
true
echo $?
0
false
echo $?
1
Використовуються як умова циклу, вони дозволяють або виконання нескінченного циклу, або дезактивацію цього циклу.
Приклад:
while true
do
echo "Do you want to continue? (yes/no)"
read ans
[[ $ans = "yes" ]] && continue
[[ $ans = "no" ]] && break
done
Структура умовного циклу until¶
Структура until / do / done обчислює команду, розміщену після until.
Якщо ця команда хибна ($? != 0), виконуються команди, розміщені між do та done. Потім сценарій повертається до початку, щоб знову оцінити команду.
Коли обчислена команда має значення true ($? = 0), оболонка відновлює виконання скрипта після першої команди після done.
Синтаксис структури умовного циклу until:
until command
do
command if $? != 0
done
Приклад використання умовної структури until:
until [[ -e test_until ]]
do
echo "The file does not exist"
touch test_until
done
Структура альтернативного вибору select¶
Структура select / do / done дозволяє відобразити меню з кількома варіантами вибору та запитом на введення.
Кожен елемент у списку має пронумерований вибір. Коли ви вводите вибір, вибране значення присвоюється змінній, розміщеній після select (створеній для цієї мети).
Потім він виконує команди, розміщені між do та done із цим значенням.
- Змінна
PS3містить запрошення ввести вибір; - Змінна
REPLYповерне номер вибору.
Для виходу з циклу потрібна команда break.
Примітка
Структура `select` дуже корисна для невеликих і простих меню. Щоб налаштувати більш повне відображення, потрібно використовувати команди `echo` і `read` у циклі `while`.
Синтаксис структури умовного циклу select:
PS3="Your choice:"
select variable in var1 var2 var3
do
commands
done
Приклад використання умовної структури select:
PS3="Your choice: "
select choice in coffee tea chocolate
do
echo "You have chosen the $REPLY: $choice"
done
Якщо запустити цей сценарій, він покаже щось на зразок цього:
1) Coffee
2) Tea
3) Chocolate
Your choice : 2
You have chosen choice 2: Tea
Your choice:
Структура циклу в списку значень for¶
Структура for / do / done призначає перший елемент списку змінній, розміщеній після for (створеній з цього приводу). Потім він виконує команди, розміщені між do та done із цим значенням. Потім сценарій повертається на початок, щоб призначити робочій змінній наступний елемент списку. Після використання останнього елемента, оболонка відновлює виконання з першої команди після done.
Синтаксис структури циклу в списку значень for:
for variable in list
do
commands
done
Приклад використання умовної структури for:
for file in /home /etc/passwd /root/fic.txt
do
file $file
done
Будь-яку команду, яка створює список значень, можна розмістити після in за допомогою підвиконання.
- Якщо змінна
IFSмістить$' \t\n', циклforзайматиме кожен словорезультату цієї команди як список елементів для циклу. - Якщо змінна
IFSмістить$'\t\n'(тобто без пробілів), циклforбратиме кожен рядок результату ця команда.
Це можуть бути файли в каталозі. У цьому випадку змінна прийматиме як значення кожне зі слів наявних імен файлів:
for file in $(ls -d /tmp/*)
do
echo $file
done
Це може бути файл. У цьому випадку змінна прийматиме як значення кожне слово, що міститься у файлі, який переглядається, від початку до кінця:
cat my_file.txt
first line
second line
third line
for LINE in $(cat my_file.txt); do echo $LINE; done
first
line
second
line
third line
line
Щоб прочитати файл рядок за рядком, потрібно змінити значення змінної середовища IFS.
IFS=$'\t\n'
for LINE in $(cat my_file.txt); do echo $LINE; done
first line
second line
third line
Author: Antoine Le Morvan
Contributors: Steven Spencer, Ganna Zhyrnova