🐛 Типичные ошибки

К оглавлению урока

⚡ Главные ошибки ДЗ 27 и 28

  • ping_time неопределена — при неудачном пинге переменная пустая; нужна проверка [ -z "$ping_time" ]
  • failures не сбрасывается — при успехе нужно делать failures=0
  • Маркеры конфликта в коде — если оставить <<<<<<< в файле — код сломается

Ошибки в ДЗ 27: ping-скрипт

1. Переменная ping_time не определена при ошибке пинга

Проблема: Если ping не достиг цели, строка icmp_seq не появится в выводе, и ping_time останется пустой строкой. При попытке сравнить пустую строку с числом bash выдаст ошибку.
# Неправильно: сравнение без проверки
if [ "$ping_time" -gt "$max_ping_time_ms" ]; then

# Правильно: сначала проверить, что переменная непустая
if [ -n "$ping_time" ] && [ "$ping_time" -gt "$max_ping_time_ms" ]; then

2. Счётчик failures инкрементируется, но не уменьшается при успехе

Проблема: Если пинг не удался дважды, а затем удался, счётчик failures остаётся на 2, а не сбрасывается в 0. Следующий единственный неудачный пинг даст 3 — и сработает ложная тревога.
# Неправильно: нет сброса при успехе
if [ -z "$ping_time" ]; then
  ((failures++))
fi

# Правильно: сбрасывать при успехе
if [ -z "$ping_time" ]; then
  ((failures++))
else
  failures=0   # сброс счётчика при успехе
fi

3. Синтаксис awk в подстановке команды

Проблема: Использование $(echo "$ping_result" | awk -F'=' '{print $4}' ...) — популярная ошибка при экранировании кавычек внутри $().
# Потенциально проблемный синтаксис:
ping_time=$(echo "$ping_result" | awk -F'=' '{print $4}' | awk '{print $1}')

# Если возникают проблемы, можно разбить на переменные:
raw=$(echo "$ping_result" | awk -F'=' '{print $4}')
ping_time=$(echo "$raw" | awk '{print $1}' | awk -F'.' '{print $1}')

4. Флаг -z в условии

[ -z "$ping_time" ] — проверяет, является ли строка пустой (zero length). Противоположный флаг: [ -n "$ping_time" ] — строка непустая (non-empty).

5. Бесконечный цикл while true

Важно знать: Скрипт выполняется бесконечно. Для остановки нажмите Ctrl+C в терминале. Это посылает процессу сигнал SIGINT.

Ошибки в ДЗ 28: merge конфликты

1. Оставить маркеры конфликта в файле

Проблема: Если при разрешении конфликта оставить маркеры <<<<<<<, =======, >>>>>>> в файле — код перестанет работать (синтаксическая ошибка в скрипте или программе).
# Пример конфликта в файле:
<<<<<<< HEAD
echo "version from main branch"
=======
echo "version from feature branch"
>>>>>>> feature-branch

# После разрешения файл должен содержать только нужную версию:
echo "version from main branch"

2. Забыть git add после ручного разрешения

Проблема: Разрешили конфликт вручную, но забыли выполнить git add <файл> перед git merge --continue. Git ещё считает файл конфликтующим.
# Правильная последовательность:
# 1. Отредактировать конфликтующий файл
# 2. Убрать маркеры, выбрать нужную версию
# 3. git add <файл>    -- ОБЯЗАТЕЛЬНО!
# 4. git merge --continue

3. find -exec rm -rf без проверки

Опасно: Команда find . -type d -name ".git" -exec rm -rf {} + безвозвратно удаляет историю коммитов во всех найденных репозиториях. Всегда делайте резервную копию перед выполнением!