В этом руководстве мы объясним два наиболее полезных расширения bash, используемых в сценариях оболочки:
- $ () - подстановка команды
- $ {} - подстановка параметра / расширение переменной
Расширение в Shell выполняется в сценарии после того, как он был разделен на токены. Токен - это последовательность символов, рассматриваемая оболочкой как единое целое. Это может быть слово или оператор.
Мы запустили все примеры и сценарии, упомянутые в этой статье, в системе Debian 10 Buster. Однако вы можете легко воспроизвести их в большинстве оболочек Linux. В этом руководстве мы используем командную строку Debian по умолчанию, Терминал. В Debian вы можете получить к нему доступ через панель поиска Application Launcher следующим образом:
Чтобы получить доступ к средству запуска приложений, просто нажмите клавишу Super / Windows на клавиатуре.
$ () Подстановка команд
Согласно официальному справочному руководству GNU Bash:
Подстановка команд позволяет выводить команду вместо самой команды. Bash выполняет раскрытие, выполняя команду и заменяя подстановку команды стандартным выводом команды с удалением любых завершающих символов новой строки. Встроенные символы новой строки не удаляются, но их можно удалить во время разделения слов. Подстановка команд происходит, когда команда заключена следующим образом:
$(команда)или
``команда``
Например, следующие команды echo заменяют выходные данные команды date своими входными данными:
$выбросил$(Дата)$выбросил'Дата'
Вы также можете использовать подстановку команд для присвоения значения переменной. Например, мы напечатаем сегодняшнюю дату через переменную TODAY следующим образом:
$CЕГОДНЯ= $(Дата)$выбросил '$ СЕГОДНЯ'
Еще одна полезность подстановки команд - использование циклов оболочки для получения входных данных. Здесь мы попытаемся распечатать все файлы .txt в нашей домашней папке, используя подстановку команд:
дляжв /дом/тебе/ *.текстделать
выбросил '$ f'
сделано
Использование подстановки команд в сценарии оболочки
Приведенные выше примеры представляют собой несколько способов использования возможности подстановки команд в сценарии оболочки. Вот пример отчета о состоянии, который мы можем распечатать с помощью следующего сценария оболочки:
#! / bin / shвыбросил ***Отчет о состоянии дел***
CЕГОДНЯ= $(Дата)
выбросил 'Сегодня$ СЕГОДНЯ'
ПОЛЬЗОВАТЕЛИ= $(кто | Туалет-)
выбросил 'ПОЛЬЗОВАТЕЛИ $пользователи в настоящее время вошли в систему '
UPTIME= $(Дата;время безотказной работы)
выбросил 'Время безотказной работы$ UPTIME'
В этом скрипте подстановка команд использовалась трижды; в печати даты, авторизованных пользователей и времени безотказной работы. Мы сохранили скрипт следующим образом:
Сделал его исполняемым, а затем запустил следующую команду:
$chmod+ x status.sh$./statys.sh
Вот результат нашего скрипта status.sh:
Конечно, вы можете создавать более содержательные сценарии, следуя только что упомянутым примерам.
$ {} Замена / расширение параметра
Параметр в Bash - это объект, который используется для хранения значений. На параметр можно ссылаться по номеру, имени или специальному символу. Когда на параметр ссылается число, он называется позиционный параметр . Когда на параметр ссылается имя, он называется Переменная . Когда на параметр ссылается специальный символ, это означает, что они автоматически устанавливаются для специальных целей.
Расширение / замена параметра - это процесс выборки значения из объекта / параметра, на который имеется ссылка. Это похоже на то, что вы расширяете переменную, чтобы получить ее значение.
Самый простой возможный синтаксис раскрытия параметров следующий:
Вот как вы можете использовать расширение параметра в Bash:
$ {параметр}Например, самый простой способ - заменить параметр его значением:
$имязнак равно'Джон Доу'$выбросил $ {имя}
Эта команда заменит значение имени переменной, которое будет использоваться командой echo:
Вы можете подумать, что того же можно добиться, отказавшись от фигурных скобок следующим образом:
Ответ заключается в том, что во время расширения параметра эти фигурные скобки помогают ограничить имя переменной. Поясним, что мы имеем в виду, говоря здесь об ограничении. Позвольте мне запустить в моей системе следующую команду:
$выбросил 'Имя человека$ name_'В результате не было напечатано значение имени переменной, поскольку система подумала, что я имел в виду переменную name_. Таким образом, имя моей переменной не было разделено. Фигурные скобки в следующем примере будут разделять имя переменной и возвращать результаты следующим образом:
$выбросил 'Имя человека$ {имя}_ 'Вот все способы подстановки переменных в Shell:
$ {переменная} | Эта команда заменяет значение переменной. |
$ {переменная: -слово} | Если переменная равна нулю или не установлена, вместо переменной подставляется слово. Значение переменной не меняется. |
$ {переменная: = слово} | Если переменная имеет значение NULL или не задана, значение переменной устанавливается равным word. |
$ {переменная:? сообщение} | Если переменная имеет значение null или не задана, сообщение печатается со стандартной ошибкой bash. |
$ {переменная: + слово} | Если Переменная установлен, слово заменяется на переменную. Однако само значение переменной не меняется. |
Приведенные выше примеры представляют собой несколько способов использования возможности подстановки переменных в Bash. Вы можете включить эти способы использования расширения в сценарии оболочки для оптимального выполнения поставленной задачи.