
Конструкция $(команда) позволяет напрямую присвоить результат выполнения команды переменной. Например, files=$(ls /var/log) сохранит список файлов каталога /var/log в переменной files. Это особенно удобно для динамического формирования списков или передачи данных между командами.
позволяет напрямую присвоить результат выполнения команды переменной. Например, files=$(ls /var/log) сохранит список файлов каталога /var/log в переменной files. Это особенно удобно для динамического формирования списков или передачи данных между командами.»>
Для быстрого анализа и фильтрации результатов можно комбинировать несколько команд в одной конструкции. Например, active_users=$(who | awk ‘{print $1}’) сохранит только имена текущих пользователей без дополнительных полей.
Ниже приведен пример использования конструкции $(команда) с проверкой кода возврата:
| Команда | Описание |
|---|---|
| output=$(grep «error» /var/log/syslog) | Сохраняет все строки с «error» из системного журнала в переменную output. |
| if [ $? -eq 0 ]; then echo «Найдены ошибки»; fi | Проверяет, были ли найдены совпадения, используя код возврата предыдущей команды. |
Конструкция $(команда) удобна для вложенных команд, когда результат одной команды используется в качестве аргумента другой: tar -czf backup_$(date +%Y%m%d).tar.gz /home/user создаст архив с текущей датой в имени.
При использовании обратных кавычек важно правильно экранировать вложенные команды. Если внутри конструкции необходимо выполнить дополнительную команду, применяют обратную косую черту: result=`echo \`date +%Y-%m-%d\«.
Обратные кавычки удобны в скриптах, где требуется совместимость с более старыми версиями Bash или POSIX-совместимыми оболочками, однако для вложенных команд конструкция $(команда) обеспечивает более читаемый и безопасный синтаксис.
users=`who | awk ‘{print $1}’` – сохраняет список текущих пользователей в переменную users для последующей обработки в условных операторах или циклах.
- files=»$(ls -1 /var/log)» – каждая запись остаётся на отдельной строке.
- users=»$(who)» – сохраняет формат колонок и переносы строк из команды who.
Для итерации по строкам многострочной переменной используют цикл while read:
:»>
- echo «$files» | while read line; do
- echo «Файл: $line»
- done
- IFS=$’\n’ – разделение по переносу строки.
- После обработки можно вернуть IFS к стандартному значению: IFS=$’ \t\n’.
Такой подход позволяет безопасно сохранять и использовать списки файлов, пользователей или логов без потери структуры и информации о переносах строк.
Удаление лишних пробелов и символов переноса при присвоении

- tr -d ‘\n’ – удаляет все переносы строк: result=$(echo «$output» | tr -d ‘\n’).
- tr -s ‘ ‘ – сжимает повторяющиеся пробелы до одного: clean=$(echo «$output» | tr -s ‘ ‘).
- command substitution с parameter expansion: trimmed=»${output//[$’\t\r\n’]}» удаляет табуляции, возвраты каретки и переносы строк.
- awk или sed для более точечной очистки: clean=$(echo «$output» | awk ‘{$1=$1; print}’) удаляет ведущие и конечные пробелы каждой строки.
Использование этих методов позволяет получить компактный и предсказуемый результат для переменной, пригодный для условий, циклов и аргументов других команд.

Для обработки строк с кавычками внутри можно использовать экранирование: escaped=$(echo «$output» | sed ‘s/»/\\»/g’). Такой подход позволяет безопасно передавать значения в другие команды, не нарушая синтаксис.
Если требуется передавать список аргументов, содержащих пробелы, лучше использовать массивы:
При циклической обработке элементов массива сохраняются все пробелы и кавычки:
for file in «${files_array[@]}»; do echo «Файл: $file»; done. Это предотвращает ошибки при работе с путями и именами файлов с пробелами или кавычками.
- output=$(command) – выполнение команды и присвоение результата.
- Альтернатива с оператором || для краткой записи:
- output=$(command) || { echo «Команда завершилась с ошибкой»; exit 1; }
- Использование set -e в скрипте автоматически завершает выполнение при ошибках, предотвращая дальнейшую работу с некорректной переменной.
Примеры практического применения:
tar -czf backup_$(date +%Y%m%d).tar.gz «$files» – использование переменной с путями файлов для создания архива с динамическим именем.
grep «error» «$log_file» – поиск ошибок в логах, где имя файла было сохранено ранее в переменной.
Также переменные удобно использовать в комбинации с командами фильтрации и преобразования:
sorted=$(echo «$files» | sort -r) – сортировка списка файлов, сохранённого в переменной, перед передачей его другой команде.
Вопрос-ответ:
В чём разница между $(команда) и обратными кавычками при присвоении вывода переменной?
Конструкция $(команда) более читаема и удобна для вложенных команд, потому что внутри неё можно безопасно помещать другие команды без экранирования. Обратные кавычки `команда` выполняют ту же функцию, но вложенные команды требуют экранирования обратными косыми чертами. Также $(команда) проще обрабатывать в скриптах с длинными выражениями и сохраняет переносы строк корректнее при сочетании с двойными кавычками.
Как сохранить многострочный вывод команды так, чтобы каждая строка оставалась отдельной при последующей обработке?
Для этого переменную нужно заключать в двойные кавычки при использовании: «$variable». Например, files=»$(ls -1 /var/log)» сохранит каждый файл на отдельной строке. Если нужно обработать строки по одной, можно использовать цикл while read или преобразовать переменную в массив через readarray -t. Это позволяет обходить каждую строку без слияния пробелов и переносов строк.
Как убрать лишние пробелы и символы переноса при присвоении вывода команды переменной?
Для очистки вывода можно применять команды tr или встроенное расширение параметров Bash. Например, clean=$(echo «$output» | tr -d ‘\n’) удаляет все переносы строк, а clean=$(echo «$output» | tr -s ‘ ‘) сжимает повторяющиеся пробелы. Альтернатива с параметрическим расширением: trimmed=»${output//[$’\t\r\n’]}» удаляет табуляции, возвраты каретки и переносы строк одновременно. Это удобно, когда результат нужно передать в другую команду как единое значение.
Что делать, если команда, вывод которой сохраняется в переменную, завершилась с ошибкой?
После присвоения вывода переменной стоит проверить код возврата команды через $?. Например, output=$(command); if [ $? -ne 0 ]; then echo «Ошибка выполнения»; fi. Можно также использовать краткую форму: output=$(command) || { echo «Ошибка»; exit 1; }. Если скрипт содержит несколько таких присвоений, полезно включить set -e, чтобы прекращать выполнение при первой ошибке и избегать дальнейшей работы с некорректной переменной.
