Ошибка 1: >> vs > в строке tar
Проблема: накопление дублей в ArhList.txt
В строке
Если запустить скрипт несколько раз подряд — список файлов в ArhList.txt будет многократно дублироваться. Это может быть нежелательно.
Решение: Если нужен только актуальный список — замените
В строке
tar -czvf $ARHPATH/Arh-$DATE.tar.gz Dir* >> ArhList.txt используется >> (дополнение), а не > (перезапись).Если запустить скрипт несколько раз подряд — список файлов в ArhList.txt будет многократно дублироваться. Это может быть нежелательно.
Решение: Если нужен только актуальный список — замените
>> на >. Если нужен журнал всех запусков — оставьте >>, но добавьте дату/разделитель:echo "=== $(date) ===" >> ArhList.txttar -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 перезапишет $?.