🐛 Типичные ошибки — Завершение работы со скриптами

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

⚡ Топ ошибок

  • ⚠️ >> вместо > в tar — список архива накапливается дублями
  • Бесконечный цикл без sleep — нагрузка CPU 100%
  • ping на macOS: round-trip вместо rtt — awk не найдёт результат
  • Непроцитированные переменные с пробелами: $file вместо "$file"
  • Забытый chmod +x — Permission denied при запуске

Ошибка 1: >> vs > в строке tar

Проблема: накопление дублей в ArhList.txt
В строке tar -czvf $ARHPATH/Arh-$DATE.tar.gz Dir* >> ArhList.txt используется >> (дополнение), а не > (перезапись).

Если запустить скрипт несколько раз подряд — список файлов в ArhList.txt будет многократно дублироваться. Это может быть нежелательно.

Решение: Если нужен только актуальный список — замените >> на >. Если нужен журнал всех запусков — оставьте >>, но добавьте дату/разделитель:
echo "=== $(date) ===" >> ArhList.txt
tar -czvf $ARHPATH/Arh-$DATE.tar.gz Dir* >> ArhList.txt

Ошибка 2: Бесконечный цикл без sleep

Цикл while true; do ...; done без sleep нагружает процессор на 100%.

# ПЛОХО — грузит CPU
while true; do
    echo "checking..."
done

# ХОРОШО — с паузой
while true; do
    echo "checking..."
    sleep 1
done

Всегда добавляйте паузу в бесконечные циклы. Для мониторинга обычно достаточно интервала 1–60 секунд.

Ошибка 3: ping на macOS — разные форматы вывода

Скрипт pinger.sh с awk '/^rtt/' работает на Linux. На macOS строка статистики выглядит иначе:

# Linux:
rtt min/avg/max/mdev = 1.234/5.678/9.012/0.123 ms

# macOS:
round-trip min/avg/max/stddev = 1.234/5.678/9.012/0.123 ms

Для кросс-платформенности: awk -F'/' '/^(rtt|round-trip)/ { print $5 }'

Ошибка 4: Непроцитированные переменные с пробелами

# ПЛОХО — если $file содержит пробелы, mv получит неправильные аргументы
mv $file $filename.$new_extension

# ХОРОШО — кавычки защищают имена с пробелами
mv "$file" "$filename.$new_extension"

Всегда берите переменные с путями и именами файлов в двойные кавычки.

Ошибка 5: Забытый shebang или chmod +x

# Создали скрипт, но не назначили права
./myscript.sh
# bash: ./myscript.sh: Permission denied

# Решение
chmod +x myscript.sh
./myscript.sh

# Или запустить без chmod
bash myscript.sh

Ошибка 6: $? после нескольких команд

# ПЛОХО — $? = код возврата echo, а не ls!
ls $SCRIPTPATH/$NAME 2>/dev/null
echo "Checking..."
if [ $? -eq 0 ]   # это $? для echo, не ls!

# ХОРОШО — проверить сразу после нужной команды
ls $SCRIPTPATH/$NAME 2>/dev/null
if [ $? -eq 0 ]   # $? = код возврата ls

$? хранит код возврата последней выполненной команды. Любая команда между ls и if перезапишет $?.