Как записать вывод команды в переменную bash
Перейти к содержимому

Как записать вывод команды в переменную bash

  • автор:

Как сохранить вывод команды Linux в переменной

Оригинал: How To Assign Output of a Linux Command to a Variable
Автор: Aaron Kili
Дата публикации: 19 января 2017 года
Перевод: А. Кривошей
Дата перевода: январь 2018 г.

Обычно при работе команды Linux выводят на консоль определенную информацию: результат работы программы, либо сообщение о статусе/ошибке выполнения программы. При необходимости вы можете сохранить вывод команды в переменной, которая будет использоваться в последующих операциях.

В этой статье мы рассмотрим различные способы сохранения вывода команды оболочки в переменной, особенно это полезно при создании скриптов оболочки.

Для сохранения вывода команды в переменной вы можете использовать возможность замены команды оболочки в следующих формах:

variable_name=$(command) variable_name=$(command [option . ] arg1 arg2 . )
variable_name='command' variable_name='command [option . ] arg1 arg2 . '

Ниже приведены несколько примеров использования подстановки команд.

В этом первом примере мы будем хранить значение команды who (которая показывает, кто авторизован в системе) в переменной CURRENT_USERS:

$ CURRENT_USERS = $(who)

Затем мы можем использовать переменную в предложении, выводимом с помощью команды echo:

$ echo -e "The following users are logged on the system:\n\n $CURRENT_USERS"

В приведенной выше команде флаг -e означает интерпретацию любых управляющих последовательностей (например, \n для новой строки). Чтобы избежать потери времени и памяти, просто выполните подстановку в команде echo следующим образом:

$ echo -e "The following users are logged on the system:\n\n $(who)"

Пользователи, авторизованные в системе

Затем, чтобы продемонстрировать концепцию использования второй формы, мы можем сохранить общее количество файлов в текущем рабочем каталоге в переменной под названием FILES и использовать ее позже следующим образом:

$ FILES=`sudo find . -type f -print | wc -l` $ echo "There are $FILES in the current working directory."

Количество файлов в директории

О перенаправлении вывода команд Linux вы можете подробнее узнать в следующих статьях на нашем сайте:

  • Перенаправление ввода/вывода, каналы и фильтры
  • Перенаправление стандартных потоков данных в Linux
  • Искусство программирования на языке сценариев командной оболочки. Глава 16. Перенаправление ввода/вывода
  • Руководство по Bash для начинающих. Перенаправление ввода/вывода и циклы
  • Разработка сценариев командной оболочки для начинающих. Часть 1: Введение

Как записать вывод команды в переменную bash

Подстановка команд — это подстановка результатов выполнения команды [1] или даже серии команд; буквально, эта операция позволяет вызвать команду в другом окружении. Классический пример подстановки команд — использование обратных одиночных кавычек (`. `). Команды внутри этих кавычек представляют собой текст командной строки.

script_name=`basename $0` echo "Имя этого файла-сценария: $script_name."
rm `cat filename` # здесь "filename" содержит список удаляемых файлов. # # S. C. предупреждает, что в данном случае может возникнуть ошибка "arg list too long". # Такой вариант будет лучше: xargs rm -- < filename # ( -- подходит для случая, когда "filename" начинается с символа "-" ) textfile_listing=`ls *.txt` # Переменная содержит имена всех файлов *.txt в текущем каталоге. echo $textfile_listing textfile_listing2=$(ls *.txt) # Альтернативный вариант. echo $textfile_listing2 # Результат будет тем же самым. # Проблема записи списка файлов в строковую переменную состоит в том, # что символы перевода строки заменяются на пробел. # # Как вариант решения проблемы -- записывать список файлов в массив. # shopt -s nullglob # При несоответствии, имя файла игнорируется. # textfile_listing=( *.txt ) # # Спасибо S.C.
COMMAND `echo a b` # 2 аргумента: a и b COMMAND "`echo a b`" # 1 аргумент: "a b" COMMAND `echo` # без аргументов COMMAND "`echo`" # один пустой аргумент # Спасибо S.C.

Даже когда не происходит разбиения на слова, операция подстановки команд может удалять завершающие символы перевода строки.

# cd "`pwd`" # Должна выполняться всегда. # Однако. mkdir 'dir with trailing newline ' cd 'dir with trailing newline ' cd "`pwd`" # Ошибка: # bash: cd: /tmp/dir with trailing newline: No such file or directory cd "$PWD" # Выполняется без ошибки. old_tty_setting=$(stty -g) # Сохранить настройки терминала. echo "Нажмите клавишу " stty -icanon -echo # Запретить "канонический" режим терминала. # Также запрещает эхо-вывод. key=$(dd bs=1 count=1 2> /dev/null) # Поймать нажатие на клавишу. stty "$old_tty_setting" # Восстановить настройки терминала. echo "Количество нажатых клавиш = $." # $ = количество символов в переменной $variable # # Нажмите любую клавишу, кроме RETURN, на экране появится "Количество нажатых клавиш = 1." # Нажмите RETURN, и получите: "Количество нажатых клавиш = 0." # Символ перевода строки будет "съеден" операцией подстановки команды. Спасибо S.C.
dir_listing=`ls -l` echo $dir_listing # без кавычек # Вы наверно ожидали увидеть удобочитаемый список каталогов. # Однако, вы получите: # total 3 -rw-rw-r-- 1 bozo bozo 30 May 13 17:15 1.txt -rw-rw-r-- 1 bozo # bozo 51 May 15 20:57 t2.sh -rwxr-xr-x 1 bozo bozo 217 Mar 5 21:13 wi.sh # Символы перевода строки были заменены пробелами. echo "$dir_listing" # в кавычках # -rw-rw-r-- 1 bozo 30 May 13 17:15 1.txt # -rw-rw-r-- 1 bozo 51 May 15 20:57 t2.sh # -rwxr-xr-x 1 bozo 217 Mar 5 21:13 wi.sh
variable1=`
# Выдержки из системного файла /etc/rc.d/rc.sysinit #+ (Red Hat Linux) if [ -f /fsckoptions ]; then fsckoptions=`cat /fsckoptions` . fi # # if [ -e "/proc/ide/$/media" ] ; then hdmedia=`cat /proc/ide/$/media` . fi # # if [ ! -n "`uname -r | grep -- "-"`" ]; then ktag="`cat /proc/version`" . fi # # if [ $usb = "1" ]; then sleep 5 mouseoutput=`cat /proc/bus/usb/devices 2>/dev/null|grep -E "^I.*Cls=03.*Prot=02"` kbdoutput=`cat /proc/bus/usb/devices 2>/dev/null|grep -E "^I.*Cls=03.*Prot=01"` . fi

Пример 14-1. Глупая выходка

#!/bin/bash # stupid-script-tricks.sh: Люди! Будьте благоразумны! # Из "Глупые выходки", том I. dangerous_variable=`cat /boot/vmlinuz` # Сжатое ядро Linux. echo "длина строки \$dangerous_variable = $" # длина строки $dangerous_variable = 794151 # ('wc -c /boot/vmlinuz' даст другой результат.) # echo "$dangerous_variable" # Даже не пробуйте раскомментарить эту строку! Это приведет к зависанию сценария. # Автор этого документа не знает, где можно было бы использовать #+ запись содержимого двоичных файлов в переменные. exit 0

Пример 14-2. Запись результатов выполнения цикла в переменную

#!/bin/bash # csubloop.sh: Запись результатов выполнения цикла в переменную variable1=`for i in 1 2 3 4 5 do echo -n "$i" # Здесь 'echo' -- это ключевой момент done` echo "variable1 = $variable1" # variable1 = 12345 i=0 variable2=`while [ "$i" -lt 10 ] do echo -n "$i" # Опять же, команда 'echo' просто необходима. let "i += 1" # Увеличение на 1. done` echo "variable2 = $variable2" # variable2 = 0123456789 exit 0

Подстановка команд позволяет существенно расширить набор инструментальных средств, которыми располагает Bash. Суть состоит в том, чтобы написать программу или сценарий, которая выводит результаты своей работы на stdout (как это делает подавляющее большинство утилит в UNIX) и записать вывод от программы в переменную.

#include /* Программа на C "Hello, world." */ int main()

bash$ gcc -o hello hello.c 
#!/bin/bash # hello.sh greeting=`./hello` echo $greeting
bash$ sh hello.sh Hello, world. 
output=$(sed -n /"$1"/p $file) # К примеру из "grp.sh". # Запись в переменную содержимого текстового файла. File_contents1=$(cat $file1) File_contents2=$(<$file2) # Bash допускает и такую запись.
  1. Пример 10-7
  2. Пример 10-26
  3. Пример 9-26
  4. Пример 12-2
  5. Пример 12-15
  6. Пример 12-12
  7. Пример 12-39
  8. Пример 10-13
  9. Пример 10-10
  10. Пример 12-24
  11. Пример 16-7
  12. Пример A-19
  13. Пример 27-1
  14. Пример 12-32
  15. Пример 12-33
  16. Пример 12-34

Примечания

Замещающая команда может быть внешней системной командой, внутренней (встроенной) командой или даже функцией в сценарии.

Назад К началу Вперед
Команды системного администрирования Наверх Арифметические подстановки

Как выставить значение команды grep в переменную для Linux / Unix

Как сохранить вывод команды grep в переменной оболочки? Каков синтаксис для хранения вывода команды в переменную для Linux или Unix?

Вы можете использовать grep command для любых заданных входных файлов, выбирая строки, соответствующие одному или нескольким шаблонам. По умолчанию вывод отображается на экране. Но вы можете хранить вывод в переменную в сценариях оболочки.

Синтаксис: замена команд

Подстановка команд означает не что иное, как запуск команды оболочки и сохранение ее вывода в переменную или отображение в исходном состоянии с помощью команды echo. Синтаксис выглядит следующим образом:

VAR=`command-name` VAR="`grep word /path/to/file`" ## or ## VAR=$(command-name) VAR="$(grep word /path/to/file)"

Примеры

Отображение даты и времени с помощью команды echo:

echo "Today is $(date)" ## or ## echo "Today is `date`"

Вы можете сохранить вывод команды в переменную оболочки с помощью следующего синтаксиса:

Чтобы сохранить текущую дату и время в переменном значении, существует команда под названием todays:

todays=$(date)

Вы можете вывести на экран значение $todays, для этого введите:

echo "$todays"

В этом примере используйте команду grep для поиска имени пользователя vivek и сохранения вывода в переменном значении под названием myuser:

myuser="$(grep '^vivek' /etc/passwd)" echo "$myuser"

Примеры вывода данных:

Как выставить значение команды grep в переменную для Linux / Unix

Вы можете сохранить вывод команды grep в переменном значении одновременно с печатью вывода с использованием следующего синтаксиса на основе команды tee:

foo="$(grep '^vivek' /etc/passwd | tee /dev/tty) " echo "$foo"

Это полезно для прямого вывода команды grep на переменную оболочки и отображения на экране одновременно.

Это интересно:

  • Установка и настройка сервера Apache, PHP, MySQL, phpMyAdmin на Windows 10
  • mysql_connect() и PHP 7
  • Лучшие хакерские программы

Оставить ответ Отменить ответ

�� С 20 по 22 апреля пройдут незабываемые битвы среди кибер-гладиаторов в мире информационной безопасности!

Открыта регистрация команд по ссылке .

Как присвоить результат команды переменной оболочки

Как сохранить выходные данные команды grep в переменной оболочки? Каков синтаксис для хранения вывода команды в переменной в Linux или Unix?

Вы можете использовать команду grep для любых заданных входных файлов, выбирая строки, соответствующие одному или нескольким шаблонам. По умолчанию вывод выводится на экран. Но вы можете сохранить вывод в переменную в сценариях оболочки.

Синтаксис

Команды подстановки означают не что иное, как запуск команды оболочки и сохранение ее вывода в переменной или отображение обратно с помощью команды echo. Синтаксис:

VAR=`command-name` VAR="`grep word /path/to/file`" ## или ## VAR=$(command-name) VAR="$(grep word /path/to/file)"

Пример

Чтобы отобразить дату и время с помощью команды echo:

echo "Today is $(date)" ## или ## echo "Today is `date`"

Вы можете сохранить вывод команды в переменной оболочки, используя следующий синтаксис:Чтобы сохранить текущую дату и время в переменной под названием todays:

todays=$(date)

Вы можете просмотреть значение $todays, введите:

echo "$todays"

В этом примере используйте команду grep для поиска имени пользователя под названием vivek и сохранения вывода в переменной myuser:

myuser="$(grep '^vivek' /etc/passwd)" echo "$myuser"

присвоение значений переменной

Вы можете сохранить вывод команды grep в переменной одновременно с выводом на экран, используя следующий синтаксис команды tee:

foo="$(grep '^vivek' /etc/passwd | tee /dev/tty) " echo "$foo"

Это полезно для прямого вывода команды grep в переменную оболочки и отображения на экране одновременно.

Похожие статьи:

  1. В какую группу входит пользователь. Шпаргалка для Linux
  2. Как проверить размер файла в Linux / Unix
  3. Вычитание из даты bash
  4. Как получить доменное имя из URL в скрипте оболочки bash

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *