Основы программирования в Linux
Все это выглядит немного запутанно, но если осваивать все возможности постепенно, то вы увидите, что все не так сложно, как кажется на первый взгляд. Самый легкий способ понять регулярные выражения — просто попробовать применить несколько.
1. Начнем с поиска строк, заканчивающихся буквой "е". Возможно, вы уже догадались, что нужно использовать специальный символ
:$$ <b>grep e$ words2.txt</b>Art thou not, fatal vision, sensibleI see thee yet, in form as palpableNature seems dead, and wicked dreams abuse$Как видите, найдены строки, заканчивающиеся буквой "е".
2. Теперь найдите трехбуквенные слова, начинающиеся с символов "Th". В данном случае вам понадобится шаблон
для ограничения длины слова и[[:space:]]для единственного дополнительного символа..$ <b>grep Th.[[:space:]] words 2.txt</b>The handle toward my hand? Come, let me clutch thee.The curtain'd sleep; witchcraft celebratesThy very stones prate of my whereabout,$3. В заключение примените расширенный режим поиска в команде
для обнаружения слов из строчных букв длиной ровно 10 символов. Для этого задайте диапазон совпадающих символов от а до z и 10 повторяющихся совпадений.grep$ <b>grep -Е [a-z]\{10\} words2.txt</b>Proceeding from the heat-oppressed brain?And such an instrument I was to use.The curtain'd sleep; witchcraft celebrateshy very stones prate of my whereabout,$Приведенные примеры лишь коснулись наиболее важных компонентов регулярных выражений. Как и для большинства составных частей ОС Linux, существует множество дополнительной документации помимо этой книги, которая поможет вам узнать еще больше подробностей, но лучший способ изучения регулярных выражений — экспериментировать с ними.
Выполнение команд
При написании сценариев вам часто требуется перехватить результат выполнения команды для использования его в сценарии командной оболочки; т.е. вы хотите выполнить команду и поместить ее вывод в переменную.
Сделать это можно с помощью синтаксической конструкции
, показанной ранее в примере с командой$(<i>команда</i>). Существует устаревший вариант подстановки командыset, который все еще широко распространен.`<i>команда</i>`ПримечаниеВ более раннем варианте конструкции применяется обратный апостроф или обратная кавычка (
), а не обычный апостроф (`), который мы использовали раньше в командной оболочке для экранирования (защиты от подстановки переменных). В сценариях оболочки применяйте этот вариант, только если вы хотите добиться высокой степени переносимости сценариев.'Во всех современных сценариях следует применять конструкцию выполнения или подстановки команды
, которая введена для того, чтобы избавиться от довольно сложных правил использования символов$(<i>команда</i>),$и'внутри команды, заключенной в обратные апострофы. Если применяется обратный апостроф внутри конструкции\, его необходимо экранировать символом`...`. Эти непонятные знаки часто заставляют программистов путаться, и иногда даже опытные специалисты в программировании средствами командной оболочки вынуждены ставить опыты для того, чтобы добиться правильного использования кавычек и апострофов в командах, заключенных в обратные апострофы.\Результат выполнения конструкции
— просто вывод команды. Имейте в виду, что это не статус возврата команды, а просто строковый вывод, показанный далее.$(<i>команда</i>)#!/bin/shecho The current directory is $PWDecho The current users are $(who)exit 0Поскольку текущий каталог — это переменная окружения командной оболочки, первая строка не нуждается в применении подстановки команды. Результат выполнения программы
, напротив, нуждается в ней, если он должен стать переменной в сценарии.whoЕсли вы хотите поместить результат в переменную, то можете просто присвоить его обычным образом:
whoisthere=$(who)echo SwhoisthereВозможность поместить результат выполнения команды в переменную сценария — очень мощное средство, поскольку оно облегчает использование существующих команд в сценариях и перехват результата их выполнения. Если когда-нибудь вам понадобится преобразовать набор параметров, представляющих собой вывод команды на стандартное устройство вывода, и передать их как аргументы в программу, возможно, вас порадует то, что команда
сможет это сделать за вас. Дополнительные подробности ищите на страницах интерактивного справочного руководства.xargsИногда возникают проблемы, если команда, которую вы хотите выполнить, выводит несколько пробелов перед нужным вам текстом, или больше информации, чем вам нужно. В таких случаях можно воспользоваться командой
, как было показано ранее.setПодстановки в арифметических выраженияхМы уже использовали команду
, которая позволяет выполнять простые арифметические операции, но она делает это очень медленно, потому что для выполнения командыexprзапускается новая командная оболочка.exprСовременная и лучшая альтернатива — синтаксическая конструкция
. Поместив в эту конструкцию выражение, которое вы хотите вычислить, вы можете выполнить простые арифметические операции гораздо эффективнее.$((...))#!/bin/shх=0while [ "$х" -ne 10 ]; doecho $хх=$(($x+1))doneexit 0ПримечаниеОбратите внимание на тонкое отличие приведенной подстановки от команды
. Двойные скобки применяются для подстановки значений в арифметические выражения. Вариант с одиночными скобками, показанный ранее, используется для выполнения команд и перехвата их вывода.х=$(...)