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

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

⚡ Топ-5 ошибок

  • Нет shebang #!/bin/bash — скрипт работает непредсказуемо.
  • Забыли chmod +x — "Permission denied" при ./script.sh.
  • Пробелы в условии: if[-d "$F"] → ошибка; нужно if [ -d "$F" ].
  • if [ $# -eq 0] — нет пробела перед ] → ошибка парсинга.
  • Скрипт продолжается после ошибки команды (по умолчанию). Добавьте set -e.

Ошибка 1: Забыли shebang

Проблема: Скрипт без #!/bin/bash может работать непредсказуемо — система использует оболочку по умолчанию, которая может не поддерживать bash-синтаксис.

Симптом: Ошибки вида syntax error near unexpected token, скрипт работает иначе, чем ожидается.

Исправление: Первая строка файла — #!/bin/bash, без пробела между #! и путём.
# Неверно
echo "Hello"
date

# Верно
#!/bin/bash
echo "Hello"
date

Ошибка 2: Забыли chmod +x

Проблема: Запуск ./script.sh даёт Permission denied.

Причина: Файл не имеет прав на исполнение.

Исправление: chmod +x script.sh перед первым запуском.
Альтернатива: вызывать через bash script.sh — права исполнения не нужны.

Ошибка 3: Пробелы в if [ ] обязательны

Проблема: [ — это команда (alias для test), а не синтаксический символ. Пробелы обязательны.

Симптом: [-d: command not found или syntax error.
# Неверно — нет пробелов
if [-d "$FILE"]; then

# Неверно — нет пробела перед ]
if [ -d "$FILE"]; then

# Верно — пробелы с обеих сторон
if [ -d "$FILE" ]; then

Ошибка 4: Скрипт продолжается после ошибки

Проблема: По умолчанию Bash продолжает выполнение скрипта даже если какая-то команда завершилась с ошибкой.

Симптом: Ошибка в середине скрипта не видна — скрипт "завершился успешно", но часть работы не сделана.
# Добавьте в начало для остановки при первой ошибке
#!/bin/bash
set -e   # Остановить скрипт при ошибке любой команды

# Дополнительно: вывести трассировку выполнения
set -x   # Показывать каждую команду перед выполнением

Ошибка 5: Пустая переменная $1 без проверки

Проблема: Если скрипт ожидает аргумент $1, но пользователь его не передал, скрипт может работать с пустой переменной и давать неожиданные результаты.

Исправление: Всегда проверяйте наличие аргументов в начале скрипта.
#!/bin/bash
# Правильная проверка аргументов
if [ $# -eq 0 ]; then
    echo "Usage: $0 <num_files>"
    exit 1
fi
NUM_FILES=$1

Ошибка 6: Переменная без $ в echo

Проблема: echo NAME выводит текст «NAME»; echo $NAME — значение переменной.
NAME="Andrew"

echo NAME     # выводит: NAME
echo $NAME    # выводит: Andrew
echo "$NAME"  # правильно: выводит: Andrew (в кавычках — безопасно)