Ошибка 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 (в кавычках — безопасно)