Вики / Базовые команды
Bash-скрипты (основы)
Переменные, условия, циклы, аргументы и безопасный режим 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)" # подстановка вывода
См. также
- Базовые команды с файлами — Базовые команды
- grep (поиск по тексту) — Базовые команды
- Переменные окружения и PATH — Базовые команды