linux-labs

Вики / Базовые команды

Bash-скрипты (основы)

Концепция bash 5 БазовоеТекст и потоки

Переменные, условия, циклы, аргументы и безопасный режим set -euo pipefail.

Скрипт начинается с shebang и должен быть исполняемым:

#!/usr/bin/env bash
set -euo pipefail                 # безопасный режим (см. вкладку)
echo "Привет, $1"
chmod +x script.sh                # сделать исполняемым
./script.sh аргумент              # запустить
bash script.sh                    # или так (без +x)
name="world"                      # без пробелов вокруг =
echo "Hello $name"                # двойные кавычки — подстановка
echo 'literal $name'              # одинарные — буквально
count=$(ls | wc -l)               # подстановка вывода команды
echo "${name:-default}"           # значение по умолчанию, если пусто
echo "${file%.txt}.bak"           # отрезать суффикс
"$1" "$2" "$@"                     # аргументы скрипта (кавычки обязательны!)

Всегда кавычь переменные: "$var". Иначе пробелы и пустые значения ломают логику.

if [ -f "$file" ]; then echo "файл есть"; fi
if [ "$x" -gt 10 ]; then ...; elif [ -z "$x" ]; then ...; else ...; fi

# тесты: -f файл, -d каталог, -z пусто, -n непусто, == строки, -eq/-gt числа

for f in *.log; do echo "$f"; done
for i in $(seq 1 5); do echo "$i"; done
while read -r line; do echo "$line"; done < file.txt

cmd && echo ok || echo fail       # по результату

Ставь в начало серьёзных скриптов:

  • set -e — выходить при первой ошибке (ненулевой код);
  • set -u — падать на необъявленной переменной (ловит опечатки);
  • set -o pipefail — ошибка в любом звене конвейера = ошибка всего.

Без этого скрипт «молча едет дальше» после сбоя — частый источник катастроф (удаление не туда, деплой битого).

unbound variable

set -u поймал необъявленную переменную (часто опечатка). Объяви или дай дефолт: "${VAR:-}".

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

Нет set -e. Добавь set -euo pipefail. Проверяй код возврата: $?.

«command not found» в cron, а в шелле работает

Скудный $PATH/окружение у cron — указывай абсолютные пути (см. env-vars).

Пробелы в именах файлов ломают цикл

Кавычь ("$f"), для find используй -print0 | xargs -0 (см. xargs).

#!/usr/bin/env bash
set -euo pipefail
for f in *.txt; do mv "$f" "${f%.txt}.bak"; done
if [ -f "$1" ]; then ...; fi
var="${1:-default}"               # аргумент или дефолт
"$(cmd)"                          # подстановка вывода

См. также