В этой статье мы рассмотрим различные советы, приемы и примеры "фишек" оболочки Bash, которые помогут вам стать более продвинутым кодером и пользователем Bash. Bash позволяет вам учиться по ходу работы, что делает оболочку более приятной. Первую статью из нашего цикла можно найти здесь: Полезные советы и фишки оболочки Bash, Часть 1
В цикле статей вы узнаете:
- Полезные советы, приемы и методы работы с командной строкой Bash
- Как взаимодействовать с командной строкой Bash продвинутым образом
- Как отточить свои навыки работы с Bash в целом и стать более опытным пользователем Bash
Содержание:
- Требования к программному обеспечению и условные обозначения
- Ловим этот обманчивый IP-адрес
- Подстановка имён файлов и необходимость правильного цитирования
- Заключение
Требования к программному обеспечению и условные обозначения
Категория | Требования или используемая версия программного обеспечения |
---|---|
Система | Свободные дистрибутивы GNU/Linux |
Программное обеспечение | Командная строка Bash, система на базе Linux |
Другое | Различные утилиты, которые либо включены в оболочку Bash по умолчанию, либо могут быть установлены с помощью sudo apt-get install tool-name (где tool-name представляет собой инструмент, который вы хотите установить) |
Условные обозначения | # - требует, чтобы заданные linux-команды выполнялись с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo .$ - требует, чтобы заданные linux-команды выполнялись от имени обычного непривилегированного пользователя |
Пример 1: Ловим этот обманчивый IP-адрес
Иногда нашим скриптам необходимо знать, какой IP-адрес у нашей машины. Существует несколько различных методов, хотя ни один из них не является полностью надежным. Например, наличие различных сетевых адаптеров на одном компьютере может привести к изменениям в выводах различных команд. Кроме того, некоторые команды имеют ограничения.
Например, команда hostname
четко указывает в своем руководстве (для опции -I
), что она отобразит все сетевые адреса хоста, но не будет делать никаких предположений о порядке вывода. Таким образом, использование команды hostname может оказаться не самым лучшим вариантом.
Приведенные здесь примеры призваны помочь вам и предоставить предложения по дальнейшему изучению и улучшению конкретной среды. Знание запрашиваемой машины или используемой сети позволит преобразовать эти команды в более надежные скрипты получения IP-адресов.
$ MYIP="$(ip a | grep 'inet.*global' | grep -v docker | sed 's|.*inet ||' | grep -o "^[\.0-9]\+")"; echo "${MYIP}"
10.10.0.20
$ MYIP="$(ip -s route get 1 | grep -o "src [\.0-9]\+" | grep -o "[\.0-9]\+")"; echo "${MYIP}"
10.10.0.20
В первой команде мы использовали ip a
(IP-адрес), чтобы получить список всех IP-адресов, назначенных этой машине. Вы можете ввести команду ip a
непосредственно в командной строке Bash, чтобы посмотреть, как выглядит результат.
Далее мы выполнили поиск по всем глобальным inet
адаптерам и удалили из списка все сетевые подключения docker\а (Вышло не идеально; другие программы могут создавать другие сетевые интерфейсы, например, *
ssh* или другие программы виртуализации, такие как *
virtualbox`*, которые также потребуют фильтрации).
Затем мы обрабатываем входные данные с помощью sed
, чтобы удалить информацию до inet
. Наконец, мы ищем фактический IP с помощью команды grep only
, т.е. grep -o
, которая использует регулярное выражение для получения полного (IPv4) IP-адреса.
Вы также можете снова заметить, что здесь есть ограничения: как включить IP-адреса IPv6, как узнать основной IP-адрес при наличии нескольких адаптеров и т.д.
Во второй команде мы ищем первый маршрут на машине с помощью ip -s route get 1
и затем обрабатываем вывод аналогичным образом. Это потенциально более стабильный метод, позволяющий, по крайней мере, найти основной IPv4-адрес машины.
Сообщите нам в комментариях ниже ваш лучший метод получения IP и, возможно, основного IPv4-адреса с помощью сценариев Bash!
Пример 2: Подстановка имён файлов и необходимость правильного цитирования
Полезные советы Bash не заканчиваются. Двигаемся дальше!
В этом примере мы сначала создаем 3 файла, a
, b
и c
, а затем запускаем дважды echo
. Первая команда echo
правильно выводит символ *
, полученный в результате echo "*"
внутри вложенной оболочки (дочерний командный интерпретатор) $()
, в результате чего первое echo в команде выводит литерал *
. Вторая команда echo
не заключает *
в кавычки должным образом, и в результате происходит Bash globbing; *
воспринимается как идентификатор имени файла, файлы перечисляются и передаются в первый echo
. Чтобы понять это, рассмотрим следующее:
$ echo *
a b c
Таким образом, мы видим необходимость всегда правильно заключать в кавычки любой текст, который может быть интерпретирован как имя файла, даже если такой текст уже правильно заключен в кавычки внутри вложенной оболочки, как в данном случае ($(echo "*")
: обратите внимание на кавычки вокруг *
).
Заключение
В этой статье мы рассмотрели, как получить IP-адрес с помощью различных методов, и рассмотрели возможность расширения этой возможности для различных сред. Мы также изучили подстановку имён в Bash (globbing) и необходимость правильно заключать в кавычки строки, которые могут быть интерпретированы как имена файлов, чтобы избежать путаницы.
Оригинал статьи можно найти здесь.

Sample bio text.