Как использовать расширения $ () и $ {} в сценарии оболочки

How Use Expansions Shell Script



Если вы используете систему Linux, вы, возможно, уже знаете, насколько важен интерфейс оболочки для взаимодействия с вашей системой. В большинстве дистрибутивов Linux Bash является оболочкой по умолчанию, которую мы используем для выполнения команд и сценариев. Сценарий оболочки - это набор команд, которые при выполнении используются для выполнения некоторых полезных функций в Linux. Этот файл .sh, написанный пользователем, содержит все команды, используемые для выполнения задачи, поэтому нам не нужно запускать эти команды вручную, одну за другой.

В этом руководстве мы объясним два наиболее полезных расширения 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. Вы можете включить эти способы использования расширения в сценарии оболочки для оптимального выполнения поставленной задачи.