На главную

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: там сотни правил и разбор кода целиком. Здесь — десяток проверок, которые срабатывают только наверняка.