Shell и скрипты
Проверка bash-скрипта
Проверяет bash-скрипт на ошибки, из-за которых он однажды сделает не то: cd без проверки, rm -rf с переменной, for по выводу ls, bash-конструкции под #!/bin/sh. Только надёжные правила — ложных срабатываний быть не должно.
Нашлось: 10
строка 1#!/bin/sh, но внутри конструкции bashОшибка
В Debian и Ubuntu /bin/sh — это dash: [[ ]], <<< и массивы там не работают, скрипт упадёт только на проде.
Поменяйте shebang на #!/usr/bin/env bash
строка 2Нет set -euo pipefailПредупреждение
Без -e скрипт продолжит работу после ошибки, без -o pipefail не заметит падения в середине конвейера, без -u опечатка в имени переменной превратится в пустую строку.
set -euo pipefail в начале, сразу после shebang
строка 4cd без проверкиОшибка
cd $BUILD_DIR
Если каталога нет, cd напечатает ошибку, а скрипт продолжит работу в прежнем каталоге — дальше он снесёт или перезапишет не то.
cd /path || exit 1
строка 4Переменная без кавычекПредупреждение
cd $BUILD_DIR
Значение с пробелом разобьётся на несколько аргументов, а звёздочка внутри раскроется в имена файлов.
Возьмите в кавычки: rm -f "$file"
строка 5rm -rf с переменнойОшибка
rm -rf $BUILD_DIR/*
Пустая или не та переменная превращает команду в rm -rf / или в удаление чужого каталога. Классика потери данных.
Проверьте значение заранее: [ -n "$DIR" ] && [ -d "$DIR" ] || exit 1
строка 5Переменная без кавычекПредупреждение
rm -rf $BUILD_DIR/*
Значение с пробелом разобьётся на несколько аргументов, а звёздочка внутри раскроется в имена файлов.
Возьмите в кавычки: rm -f "$file"
строка 6Обратные кавычки вместо $( )Мелочь
for f in `ls /var/log/app`; do
Обратные кавычки не вкладываются друг в друга и по-разному экранируют обратный слеш.
`команда` → $(команда)
строка 6for ... in $(ls)Ошибка
for f in `ls /var/log/app`; do
Имена с пробелами и переводами строк разобьются на части, а пустой каталог даст литерал «*».
for f in ./*; do [ -e "$f" ] || continue
строка 7read без -rПредупреждение
read line
Без -r обратный слеш в строке съедается — пути вида C:\dir и экранированные символы ломаются.
read -r line
строка 12Скачивание сразу в оболочкуПредупреждение
curl -s https://example.com/install.sh | sh
Сервер может отдать одно при проверке и другое при запуске, а оборванная закачка выполнит обрезанный скрипт.
Скачайте в файл, проверьте, потом запустите
Какие правила проверяются
- Нет set -euo pipefail
- Нет строки #!
- #!/bin/sh, но внутри конструкции bash
- Обратные кавычки вместо $( )
- cd без проверки
- rm -rf с переменной
- for ... in $(ls)
- read без -r
- == внутри [ ]
- Переменная без кавычек
- Скачивание сразу в оболочку
Это не замена ShellCheck: там сотни правил и разбор кода целиком. Здесь — десяток проверок, которые срабатывают только наверняка.