Подстановка команд и арифметика
Учимся вставлять результат одной команды внутрь другой и считать числа.
Подстановка команд
$(команда)— это механизм, который запускает команду и подставляет её вывод на место выражения.
Результат команды как значение
Часто нужно сохранить вывод команды в переменную или вставить в строку. Для этого служит $(...).
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. - Путать $() и $(()). Одни скобки — запуск команды, двойные — арифметика.
Итог
$(команда)подставляет вывод команды; современная замена обратным апострофам.$((выражение))выполняет целочисленную арифметику без запуска внешних программ.- Подстановка команд работает в под-оболочке, поэтому её переменные снаружи не видны.