Linux для пользователя - Виктор Костромин
Шрифт:
Интервал:
Закладка:
Скобки необходимы только в том случае, если имя параметра состоит из нескольких цифр, или когда за именем следует символ, который не должен интерпретироваться как часть имени.
Все значения переменных подвергаются подстановке знака тильды, раскрытию параметров и переменных, подстановке команд, подстановкам арифметических выражений, а также удалению специальных символов цитирования (см. ниже). Разделение слов не производится, за исключением случая "[email protected]" (объяснение см. выше в табл. 5.3). Раскрытие шаблонов имен файлов и каталогов не производится.
5.7.4 Подстановка команд
Подстановка команд является очень мощным инструментов bash. Она заключается в замене имени команды на результат ее выполнения. Существует две формы подстановки команд:
$(command) и `command`
Если применяется вторая из этих форм, то обратный слэш внутри кавычек трактуется как литерал, кроме тех случаев, когда за ним следует $, `, или . Если же используется форма $(command), все символы внутри скобок составляют команду и ни один из них не считается специальным символом.
Если подстановка производится внутри двойных кавычек, то в результатах подстановки не осуществляется разделение слов и раскрытие шаблонов имен файлов и каталогов.
5.7.5 Арифметичеcкие подстановки (Arithmetic Expansion)
Арифметические подстановки позволяют вычислить значение арифметического выражения и подставить вместо него результат. Существует две формы задания арифметических подстановок:
$[expression]
$((expression)),
где expression трактуется так, как если бы оно было заключено в двойные кавычки, но встречающиеся в expression двойные кавычки трактуются как простой литерал. Внутри expression выполняются подстановки параметров и команд.
Синтаксис выражения expression подобен синтаксису арифметических выражений в языке C, подробнее об этом можно прочитать в разделе ARITHMETIC EVALUATION man-страницы по каманде bash. Например, команда
[user]$ echo $((2 + 3* 5))
в качестве результата выдает "17".
Если выражение некорректно, bash выдает сообщение об ошибке.
5.7.6 Разделение слов (word splitting)
После завершения подстановок параметров, команд и арифметических выражений оболочка снова анализирует командную строку (в том виде, который она приобрела к этому моменту) и осуществляет разделение слов (word splitting).
Эта операция заключается в том, что в командной строке ищутся все вхождения символов-разделителей, определенных в переменой IFS, и в соответствующих местах строки разделяются на отдельные слова. Если значение IFS равно пустой строке, разделение слов не производится.
Если в командной строке не производилось никаких подстановок, то разбиение на слова не производится.
5.7.7 Раскрытие шаблонов имен файлов и каталогов (Pathname Expansion)
Подстановки имен путей и файлов (Pathname expansion) используются для того, чтобы с помощью краткого образца или шаблона указать несколько имен файлов (или каталогов), соответствующих данному шаблону. После разделения слов, если не была задана опция -f, bash производит поиск в каждом слове командной строки символов*,?, and [. Если будет найдено слово с одним или несколькими вхождениями таких символов, то это слово рассматривается как шаблон, который должен быть заменен словами из лексикографически упорядоченного списка имен путей, соответствующих данному шаблону. Если имен, соответствующих шаблону, не найдено, и переменная nullglob не задана, слово не изменяется. Если эта переменная установлена, а путей, соответствующих шаблону не найдено, слово удаляется из командной строки.
Специальные символы шаблонов имеют следующее значение.
Таблица 5.4. Символы шаблонов
Символ Правила замены * Соответствует произвольной строке символов, включая пустую строку. Например, my*.txt будет заменено на myday.txt, myweek.txt и mymonth.txt (если такие файлы существуют), а*.jpg соответствует всем файлам с расширением jpg в указанном каталоге ? Соответствует любому одиночному символу. Например, вместо шаблона file?.txt будут подставлены имена file1.txt и filex.txt, но не file10.txt […] Соответствует любому символу из числа символов, указанных в скобках. Пары символов, разделенные знаком минуса, обозначают интервал; любой символ стоящий лексически между этими двумя символами, включая и символы, задающие интервал, соответствует шаблону. Если первым символом внутри скобок является ! или ^, то считается, что шаблону (в данной позиции) соответствуют все символы, не указанные в скобкахШаблоны имен файлов очень часто применяются в командных строках, содержащих команду ls. Представьте себе, что вы хотите просмотреть информацию о содержимом каталога, в котором находится огромное количество разных файлов различных форматов, например, файлов с изображениями форматов gif, jpeg, avi и т. д.. Чтобы получить только список файлов формата jpeg, вы можете использовать команду
[user]$ ls*.jpg
Если в каталоге имеется множество файлов, имена которых представлены четырехзначными номерами, то следующей командой можно вывести только список файлов с номерами от 0200 до 0499:
[user]$ ls -l 0[2-4]??.*
5.7.8 Удаление специальных символов
После того, как все подстановки в командной строке сделаны, из нее еще удаляются все вхождения символов , ` и ", которые служили для отмены специального значения других символов.
5.8. Shell как язык программирования
Как уже говорилось выше, для построения произвольных алгоритмов необходимо иметь операторы проверки условий. Оболочка bash поддерживает операторы выбора if… then… else и case, а также операторы организации циклов for, while, until, благодаря чему она превращается в мощный язык программирования.
5.8.1 Операторы if и test (или [])
Конструкция условного оператора в слегка упрощенном виде выглядит так:
if list1 then list2 else list3 fi
где list1, list2 и list3 - это последовательности команд, разделенные запятыми и оканчивающиеся точкой с запятой или символом новой строки. Кроме того, эти последовательности могут быть заключены в фигурные скобки: {list}.
Оператор if проверяет значение, возвращаемое командами из list1. Если в этом списке несколько команд, то проверяется значение, возвращаемое последней командой списка. Если это значение равно 0, то будут выполняться команды из list2; если это значение не нулевое, будут выполнены команды из list3. Значение, возвращаемой таким составным оператором if, совпадает со значением, выдаваемым последней командой выполняемой последовательности.
Полный формат команды if имеет вид:
if list then list [elif list then list]… [else list] fi
(здесь квадратные скобки означают только необязательность присутствия в операторе того, что в них содержится).
В качестве выражения, которое стоит сразу после if или elif, часто используется команда test, которая может обозначаться также квадратными скобками []. Команда test выполняет вычисление некоторого выражения и возвращает значение 0, если выражение истинно, и 1 в противном случае. Выражение передается программе test как аргумент. Вместо того, чтобы писать
test expression,
можно заключить выражение в квадратные скобки:
[expression].
Заметьте, что test и [- это два имени одной и той же программы, а не какое-то магическое преобразование, выполняемое оболочкой bash (только синтаксис [требует, чтобы была поставлена закрывающая скобка). Заметьте также, что вместо test в конструкции if может быть использована любая программа.
В заключение приведем пример использования оператора if:
if [-e textmode2.htm]; then
ls textmode*
else
pwd
fi
Об операторе test (или […]) надо бы поговорить особо.
5.8.2 Оператор test и условные выражения
Условные выражения, используемые в операторе test, строятся на основе проверки файловых атрибутов, сравнения строк и обычных арифметических сравнений. Сложные выражения строятся из следующих унарных или бинарных операций ("элементарных кирпичиков"):
• -a file
Верно, если файл с именем file существует.
• -b file
Верно, если file существует и является специальным файлом блочного устройства.
• -c file
Верно, если file существует и является специальным файлом символьного устройства.
• -d file
Верно, если file существует и является каталогом.
• -e file
Верно, если файл с именем file существует.
• -f file