Подстановка команд и арифметика

Учимся вставлять результат одной команды внутрь другой и считать числа.

Подстановка команд $(команда) — это механизм, который запускает команду и подставляет её вывод на место выражения.

Результат команды как значение

Часто нужно сохранить вывод команды в переменную или вставить в строку. Для этого служит $(...).

today=$(date +%Y-%m-%d)
files=$(ls | wc -l)
echo "Сегодня $today, файлов в папке: $files"

Вывод:

Сегодня 2026-06-22, файлов в папке: 14

Bash сначала выполняет date и ls | wc -l, забирает их текстовый вывод и подставляет на место $(...).

Арифметика через двойные скобки

По умолчанию всё в Bash — текст, и 2+2 останется строкой. Чтобы считать числа, нужна конструкция $((...)).

a=7
b=3
echo $((a + b))
echo $((a * b))
echo $((a % b))

Вывод:

10
21
1

Внутри $((...)) доллар перед именами переменных можно не писать. Поддерживаются + - * / % и сравнения. Деление целочисленное: $((7 / 2)) даст 3.

Старый синтаксис с апострофом

В древних скриптах подстановку писали обратными апострофами: `date`. Это работает, но устарело: апострофы трудно различить визуально и не вкладываются друг в друга. Современная форма $(...) вкладывается легко:

echo "Корень проекта: $(dirname $(pwd))"

Как работает под капотом

Для подстановки команд Bash запускает её в отдельной под-оболочке (subshell), захватывает весь её стандартный вывод (stdout), отрезает завершающие переводы строк и подставляет результат. Поэтому изменения переменных внутри $(...) не видны снаружи — это отдельный процесс. А $((...)) работает иначе: это встроенная арифметика, она не запускает внешних программ и потому быстрая.

Частые ошибки

  • Забыли кавычки вокруг подстановки. file=$(ls) с переносами строк сломается при использовании без кавычек — пишите "$(...)".
  • Ждать дробей от арифметики. $((10 / 3)) даст 3, а не 3.33. Для дробей нужен внешний bc или awk.
  • Путать $() и $(()). Одни скобки — запуск команды, двойные — арифметика.

Итог

  • $(команда) подставляет вывод команды; современная замена обратным апострофам.
  • $((выражение)) выполняет целочисленную арифметику без запуска внешних программ.
  • Подстановка команд работает в под-оболочке, поэтому её переменные снаружи не видны.
Проверьте себя
1. Что сохранит переменная now после now=$(date +%H:%M)?
AБуквальную строку date +%H:%M
BТекущее время в формате часы:минуты
CИмя команды date
DНичего
2. Чему равно echo $((10 / 3))?
A3.33
B3
C4
DОшибка
3. В чём преимущество $(...) перед обратными апострофами `...`?
AРаботает быстрее
BЛегко вкладывается друг в друга и читается
CНе требует кавычек
DПоддерживает дроби