while … do … done
while … do … done
Оператор while используется для организации циклов. Он работает так «пока (while) условие истинно, делать что-то». Рассмотрим это на примере:
#!/bin/bash
while true; do
echo "Нажмите CTRL-C для выхода."
done
true — это тоже программа. Единственное, что она тут делает — это запускает тело цикла снова и снова. Использование true считается медленным, потому что ваш скрипт должен запускать ее раз за разом. Можно использовать альтернативный вариант:
#!/bin/bash
while :; do
echo "Нажмите CTRL-C для выхода."
done
Это позволяет добиться точно такого же эффекта, но быстрее, потому что «:» — это встроенная функция bash. Единственное отличие состоит в принесении в жертву читабельности кода. Используйте из приведенных вариантов тот, который вам нравится больше. Ниже приведен гораздо более полезный вариант использования переменных:
#!/bin/bash
x=0;
while [ "$x" -le 10 ]; do
echo "Текущее значение х: $х"
# Увеличиваем значение х:
x=$(expr $x + 1)
sleep 1
done
Здесь мы используем для проверки состояния переменной x запись с квадратными скобками. Опция -le означает «меньше или равно (less or equal)». Говоря обычным языком приведенный код говорит: «пока (while) х меньше или равен 10, выводить на экран текущее значение х, после чего добавлять к текущему значению х единицу». Оператор sleep 1 приостанавливает выполнение программы на одну секунду.
Ниже приведен список возможных операций сравнения целых чисел[9]:
x -eq y x = y (equal)
x -ne y x не равен y (not equal)
x -gt y x больше, либо равен y (greater than)
x -lt y x меньше, либо равен y (lesser than)
Операторы сравнения строк:
x = y строка x идентична y
x != y строка х не совпадает y
-n x выражение истинно, если строка х ненулевой длины
-z x выражение истинно, если строка х имеет нулевую длину
Скрипт, приведенный выше, нетрудно понять, за исключением, может быть, только этой строки:
x=$(expr $x + 1)
Комментарий приведенный выше он говорит нам, что он увеличивает х на 1. Но что означает запись$ (...)? Это переменная? Нет. На самом деле это способ сказать оболочке, что вы хотите запустить команду expr $x + 1, и присвоить результат ее выполнения — х. Любая команда, заключенная в $ (…) будет выполняться:
#!/bin/bash
me=$(whoami)
echo "Привет! Меня зовут $me"
Попробуйте сделать приведенный пример, и вы поймете, что я имею в виду. Приведенный выше код можно было бы сократить без каких-либо потерь вот так:
#!/bin/bash
echo "Привет! Меня зовут $(whoami)"
Вы сами можете выбрать, какая из записей вам ближе и понятнее. Существует и другой способ для выполнения команд или передачи результата их выполнения переменной. Как это сделать — будет объяснено позже. Пока используйте запись вида $(…).