Back to: if, for, while — керуючі конструкції
0
if, for, while — управляющие конструкции
Управляющие конструкции позволяют скрипту принимать решения и повторять действия. Это основа логики bash-скриптов.
Условие: if / elif / else
#!/bin/bash
# Базовый if
if [ "$1" == "start" ]; then
echo "Запуск..."
fi
# С elif и else
if [ "$AGE" -lt 18 ]; then
echo "Несовершеннолетний"
elif [ "$AGE" -lt 65 ]; then
echo "Взрослый"
else
echo "Пенсионер"
fi
Операторы сравнения в [ ]
Числа
-eq— равно (equal)-ne— не равно (not equal)-lt— меньше (less than)-le— меньше или равно-gt— больше (greater than)-ge— больше или равно
Строки
=или==— равно!=— не равно-z— пустая строка-n— непустая строка
Файлы
-f— существует и обычный файл-d— существует и директория-e— существует-r— доступен для чтения-w— доступен для записи-x— исполняемый-s— не пустой
# Примеры проверок
if [ -f /etc/hosts ]; then
echo "Файл существует"
fi
if [ -d /var/log ]; then
echo "Директория существует"
fi
if [ -z "$VAR" ]; then
echo "Переменная пустая"
fi
Логические операторы
# AND
if [ "$A" -gt 0 ] && [ "$A" -lt 10 ]; then
echo "От 1 до 9"
fi
# OR
if [ "$STATUS" == "active" ] || [ "$STATUS" == "pending" ]; then
echo "Допустимый статус"
fi
# NOT
if [ ! -f /tmp/lock ]; then
echo "Файла нет"
fi
Цикл for
# По списку
for FRUIT in apple banana orange; do
echo "Фрукт: $FRUIT"
done
# По диапазону чисел
for i in {1..5}; do
echo "Число: $i"
done
# С шагом
for i in {0..20..5}; do
echo "Шаг: $i"
done
# C-стиль
for ((i=0; i<10; i++)); do
echo "Итерация: $i"
done
# По файлам
for FILE in /etc/*.conf; do
echo "Конфиг: $FILE"
done
# По аргументам
for ARG in "$@"; do
echo "Аргумент: $ARG"
done
Цикл while
# Пока условие истинно
COUNT=0
while [ $COUNT -lt 5 ]; do
echo "Счётчик: $COUNT"
((COUNT++))
done
# Чтение файла построчно
while IFS= read -r LINE; do
echo "Строка: $LINE"
done < /etc/hosts
# Бесконечный цикл
while true; do
echo "Работаю..."
sleep 1
done
Цикл until
# Пока условие ЛОЖНО (обратность while)
COUNT=10
until [ $COUNT -eq 0 ]; do
echo "Осталось: $COUNT"
((COUNT--))
done
case — выбор по значению
case "$1" in
start)
echo "Запуск сервиса"
;;
stop)
echo "Остановка сервиса"
;;
restart)
echo "Перезапуск"
;;
status)
echo "Статус сервиса"
;;
*)
echo "Использование: $0 {start|stop|restart|status}"
exit 1
;;
esac
break и continue
# break — выйти из цикла
for i in {1..10}; do
if [ $i -eq 5 ]; then
break
fi
echo $i
done
# Выведет 1 2 3 4
# continue — пропустить итерацию
for i in {1..10}; do
if [ $((i % 2)) -eq 0 ]; then
continue
fi
echo $i
done
# Выведет 1 3 5 7 9
$? && || — управление потоком
# && — выполнить, если предыдущая успешна (код 0)
mkdir /tmp/testdir && echo "Создано"
# || — выполнить, если предыдущая неудачна
ping -c 1 google.com || echo "Нет сети"
# Комбинирование
mkdir /tmp/testdir && echo "OK" || echo "Ошибка"
# Проверка кода завершения
command
if [ $? -eq 0 ]; then
echo "Успех"
else
echo "Ошибка: $?"
fi
Практическое задание
- Напишите скрипт с if: проверьте аргумент
$1(start/stop/restart) - Напишите цикл for по файлам
/etc/*.confи выведите их имена - Напишите while для чтения
/etc/passwdпострочно - Используйте case для меню:
case "$1" in ... esac - Создайте проверку файла:
if [ -f /etc/hostname ]; then ... fi - Используйте
&&и||:ping -c 1 8.8.8.8 && echo "OK" || echo "Fail"


Добавить комментарий