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

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

Связанные статьи:

  • Как создавать диалоговые блоки в интерактивных shell скриптах (53.9%)
  • Лучшие терминальные мультиплексные инструменты (53.9%)
  • Как обработать каждую строку, полученную от команды grep (53.9%)
  • Работа LibreOffice в командной строке: конвертирование большого количества файлов и вывод содержимого офисных файлов в консоль (53.9%)
  • Как использовать кавычки в регулярных выражениях grep (53.9%)
  • PhotoRec: восстановление удалённых и потерянных фотографий и файлов на картах памяти и жёстких дисках (RANDOM — 50%)

Практическое руководство.

Дейв Тейлор, Брендон Перри «Сценарии командной оболочки. Linux, OS X и Unix» Питер, 2017 год, 448 стр., (6,43 мб. pdf + 4,67 мб. epub)

Это второе издание книги,(первое издание книги вышло в 2004 году) дополнены новыми материалами 12 глав, добавлено 3 новые главы. В книге демонстрируются приемы создания сценариев в командной оболочке bash (скрипты). Приводятся практические примеры программирования самых распространенных (типичных) задач. с которыми сталкиваются системные администраторы и активные пользователи Unix — подобных систем.

Пользователям Windows 10, также будет интересно попробовать свои силы в создании сценариев (Microsoft выпустила bash для десятки), см. приложение A: Установка Bash в Windows 10. Все приводимые примеры: настройка и управление системой, работа с сетью, администрирование WEB-сервера и сценарии полезные для веб-мастеров, работа в облаке, с файлами и др. — могут быть взяты за основу и использоваться как шаблоны.

Используя данные примеры можно создавать и приспосабливать bash-скрипты под собственные нужды. Для начинающих пользователей обязательно следует прочесть Главу 0 (Краткое введение в сценарии командной оболочки), это новая глава, добавлена во второе издание. ISBN 978-5-496-03029-8

Скачать техническую литературу бесплатно6,43 мб. pdf Скачать техническую литературу бесплатно4,67 мб. epubПохожая литератураСовременное программирование с нуляDelphi школьникамLarge Scale Machine Learning with PythonОбучение мобильной разработке на DelphiActionScript 3.0 108_i_seti/programmirovanie/bash-skriptyBash скрипты-content/uploads/2017/08/-content/uploads/2017/08/2017-08-06T21:47:06+04:00Программирование и БДbash,Linux,OS X,Unix,ПрограммированиеПрактическое руководство. Дейв Тейлор, Брендон Перри ‘Сценарии командной оболочки. Linux, OS X и Unix’ Питер, 2017 год, 448 стр., (6,43 мб. pdf + 4,67 мб. epub) Это второе издание книги,(первое издание книги вышло в 2004 году) дополнены новыми материалами 12 глав, добавлено 3 новые главы. В книге демонстрируются приемы создания сценариев…SomМихаил Михайлов[email protected]EditorТехническая литератураПоделиться

Читайте также:  cat в Linux – всё что нужно знать

Переменные в реальном времени

Bash позволяет использовать переменные. Вы можете создавать переменные на лету и повторно использовать их во время текущего сеанса Bash. Они могут помочь вам использовать Bash по-разному, и они исчезнут после завершения текущего сеанса.

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

sitea =

После этого, если вы хотите посетить наш сайт с помощью Firefox, вы можете просто ввести:

firefox $sitea

Намного проще — и читабельнее. Переменная $sitea будет оставаться отображаться на сайте, пока вы не изменили его содержимое вручную или сеанс Bash закончился. И, конечно же, вы можете создать несколько переменных, таких , как siteb, sitec, и sited.

При настройке новых переменных вы можете использовать любые имена по своему усмотрению и хранить в них любые буквенно-цифровые строки. Однако имейте в виду, что они по умолчанию чувствительны к регистру. Таким образом, $sitea не будет таким же, как $SiteA. Также обратите внимание, что вы должны использовать кавычки при сохранении строк со специальными символами внутри них (включая пробелы).

Командная оболочка в качестве языка программирования

Итак, командную оболочку можно рассматривать как язык программирования и как программную среду выполнения одновременно. Разумеется, этот язык не компилируемый, а интерпретируемый. Он допускает использование переменных: системных или собственных. Последовательность выполнения команд программы изменяется с помощью конструкций проверки условия и выбора соответствующего варианта: if-then-else и case. Циклы while, until и for позволяют автоматизировать многократно повторяющиеся действия. Имеется возможность объединять группы команд в логические блоки. Вы можете даже писать настоящие функции с передачей в них параметров. Таким образом, налицо все признаки и характеристики полноценного языка программирования. Попробуем извлечь из этого двойную пользу – наряду с изучением основ программирования автоматизируем свою повседневную работу.

Создание файла

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

touch ~/bin/firstscriptchmod +x ~/bin/firstscript

, где firstscript — название исполняемого файла

Откройте текстовый редактор, чтобы заполнить исполняемый файл:

nano ~/bin/firstscript

Любой bash-скрипт должен начинаться со строки: #!/bin/bash

Читайте также:  Linux как посмотреть свободное место на диске?

В этой строке после #! указывается путь к bash-интерпретатору, поэтому если он установлен в другом месте (где именно, можно узнать, введя команду whereis bash), необходимо поменять путь.

Комментарии начинаются с символа # (кроме первой строки).

Заполните исполняемый файл firstscript следующими строками:

#!/bin/bashclearecho “Hello World!”

Сохраните внесенные изменения, нажав сочетание клавиш CTRL+X.

Запустите скрипт командой, которая является именем исполняемого файла:

firstscript

Результат должен выглядеть следующим образом:

Hello World!

Пример скрипта резервного копирования

Для создания bash-скрипта резервного копирования введите команды:

touch ~/bin/filebackupchmod +x ~/bin/filebackupnano ~/bin/filebackup

Скрипт для запуска резервного копирования состоит из следующих строк:

#!/bin/bash#Backup script#Копирование любого заданного файла в папку backupBACKUPFOLDER=~/backup#Установка переменной в папку Backup, для записи в которую есть соответствующие праваmkdir -p $BACKUPFOLDER#Убеждаемся, что папка для записи существуетcp -a [email protected] $BACKUPFOLDER#Данный скрипт будет копировать заданный файл в папку

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

filebackup

Можно добавить сколько угодно файлов к этой последовательности, и все они будут скопированы в папку резервного копирования backup.

Введем команду и перейдем в папку резервного копирования:

cd $BACKUPFOLDER

Для просмотра файлов в папке введем команду:

В результате должно отобразиться следующее:

Работа с внешними программами при написании shell-скриптов

Для начала немного полезной теории.

Перенаправление потоков.

В bash(как и многих других оболочках) есть встроенные файловые дескрипторы: 0 (stdin), 1 (stdout), 2 (stderr). stdout — Стандартный вывод. Сюда попадает все что выводят программы stdin — Стандартный ввод. Это все что набирает юзер в консоли stderr — Стандартный вывод ошибок. Для операций с этими дескрипторами, существуют специальные символы: > (перенаправление вывода), < (перенаправление ввода). Оперировать ими не сложно. Например: cat /dev/random > /dev/null перенаправить вывод команды cat /dev/random в /dev/null (абсолютно бесполезная операция :)) ) или ls -la > listing записать в файл listing содержание текущего каталога (уже полезней) Если есть необходимость дописывать в файл(при использовании ">" он заменятеся), необходимо вместо ">" использовать "»" sudo < my_password после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры. Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать: ./program_with_error 2> error_file цифра 2 перед ">" означает что нужно перенаправлять все что попадет в дескриптор 2(stderr). Если необходимо заставить stderr писать в stdout, то это можно можно след. образом: ./program_with_error 2>&1 символ "&" означает указатель на дескриптор 1(stdout) (Поумолчанию stderr пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)).

Читайте также:  10 способов KDE — лучший рабочий стол Linux, чем GNOME

Конвеер — очень мощный инструмент для работы с консолью Bash. Синтаксис простой: команда1 | команда 2 — означает, что вывод команды 1 передастся на ввод команде 2 Конвееры можно группировать в цепочки и выводить с помощью перенаправления в файл, например: ls -la | grep «hash» |sort > sortilg_list вывод команды ls -la передается команде grep, которая отбирает все строки, в которых встретится слово hash, и передает команде сортировке sort, которая пишет результат в файл sorting_list. Все довольно понятно и просто.

Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке stdout одной команды и передача на stdin другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты.

1. Передача вывода в переменную.

Для того чтобы записать в переменную вывод какой-либо команды, достаточно заключить команду в « ковычки, например

a = `echo "qwerty"` echo $a

Результат работы: qwerty

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

LIST=`find /svn/ -type d 2>/dev/null| awk '{FS="/"} {print $4}'| sort|uniq | tr '\n' ' '` for ONE_OF_LIST in $LIST do svnadmin hotcopy /svn/$ONE_OF_LIST /svn/temp4backup/$ONE_OF_LIST done

Здесь мы используем цикл for-do-done для архивирование всех директорий в папке /svn/ с помощью команды svnadmin hotcopy(что в нашем случае не имеет никого значения, просто как пример). Наибольшй интерес вызывает строка:

LIST=`find /svn/ -type d 2>/dev/null| awk '{FS="/"} {print $4}'| sort|uniq | tr '\n' ' '`

В ней переменной LIST присваивается выполнение команды find, обработанной командами awk, sort, uniq,tr(все эти команды мы рассматривать не будем, ибо это отдельная статья). В переменной LIST будут имена всех каталогов в папке /svn/ пгомещенных в одну строку(для того чтобы её стравить циклу.

Как видно, все не сложно, достаточно понять принцип и написать пару своих скриптов. В заключении статьи хочу пожелать удачи в изучении BASH и Linux в целом. Критика, как водится приветствуется. Следующая статья возможно будет посвещена использованию таких программ как sed, awk.

Основы BASH. Часть 1