if, for, while — керуючі конструкції

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

Практическое задание

  1. Напишите скрипт с if: проверьте аргумент $1 (start/stop/restart)
  2. Напишите цикл for по файлам /etc/*.conf и выведите их имена
  3. Напишите while для чтения /etc/passwd построчно
  4. Используйте case для меню: case "$1" in ... esac
  5. Создайте проверку файла: if [ -f /etc/hostname ]; then ... fi
  6. Используйте && и ||: ping -c 1 8.8.8.8 && echo "OK" || echo "Fail"

Comments

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Related Post