Рейтинговые книги
Читем онлайн Linux для пользователя - Виктор Костромин

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 33 34 35 36 37 38 39 40 41 ... 149

• -c file

Верно, если file существует и является специальным файлом символьного устройства.

• -d file

Верно, если file существует и является каталогом.

• -e file

Верно, если файл с именем file существует.

• -f file

Верно, если файл с именем file существует и является обычным файлом.

• -g file

Верно, если файл с именем file существует и для него установлен бит смены группы.

• -h file или -L file

Верно, если файл с именем file существует и является символической ссылкой.

• -k file

Верно, если файл с именем file существует и для него установлен "sticky'' bit.

• -p file

Верно, если файл с именем file существует и является именованным каналом (FIFO).

• -r file

Верно, если файл с именем file существует и для него установлено право на чтение

• -s file

Верно, если файл с именем file существует и его размер больше нуля.

• -t fd

Верно, если дескриптор файла fd открыт и указывает на терминал.

• -u file

Верно, если файл с именем file существует и для него установлен бит смены пользователя.

• -w file

Верно, если файл с именем file существует и для него установлено право на запись.

• -x file

Верно, если файл с именем file существует и является исполняемым.

• -O file

Верно, если файл с именем file существует и его владельцем является пользователь, на которого указывает эффективный идентификатор пользователя.

• -G file

Верно, если файл с именем file существует и принадлежит группе, определяемой эффективным идентификатором группы.

• -S file

Верно, если файл с именем file существует и является сокетом.

• -N file

Верно, если файл с именем file существует и изменялся с тех пор, как был последний раз прочитан.

• file1 -nt file2

Верно, если файл file1 имеет более позднее время модификации, чем file2.

• file1 -ot file2

Верно, если файл file1 старше, чем file2.

• file1 -ef file2

Верно, если файлы file1 и file2 имеют одинаковые номера устройств и индексных дескрипторов (inode).

• -o optname

Верно, если задействована опция оболочки optname. Пояснения см. на странице man bash.

• -z string

Верно, если длина строки равна нулю.

• -n string

Верно, если длина строки не равна нулю.

• string1 == string2

Верно, если строки совпадают. Вместо == может использоваться =.

• string1 !== string2

Верно, если строки не совпадают.

• string1 ‹ string2

Верно, если строка string1 лексикографически предшествует строке string2 (для текущей локали).

• string1 › string2

Верно, если строка string1 лексикографически стоит после строки string2 (для текущей локали).

• arg1 OP arg2

Здесь OP - это одна из операций арифметического сравнения: -eq (равно), -ne (не равно), -lt (меньше чем), -le (меньше или равно), -gt (больше), -ge (больше или равно). В качестве аргументов могут использоваться положительные или отрицательные целые.

Из этих элементарных условных выражений можно строить сколь угодно сложные с помощью обычных логических операций ОТРИЦАНИЯ, И и ИЛИ:

• !(expression)

Булевский оператор отрицания.

• expression1 -a expression2

Булевский оператор AND (И). Верен, если верны оба выражения.

• expression1 -o expression2

Булевский оператор OR (ИЛИ). Верен, если верно любое из двух выражений.

Такие же условные выражения используются и в операторах while и until, которые мы рассмотрим чуть ниже.

5.8.3 Оператор case

Формат оператора case таков:

case word in [[(] pattern [| pattern]…) list;;]… esac

Команда case вначале производит раскрытие слова word, и пытается сопоставить результат с каждым из образцов pattern поочередно. После нахождения первого совпадения дальнейшие проверки не производятся, выполняется список команд, стоящий после того образца, с которым обнаружено совпадение. Значение, возвращаемое оператором, равно 0, если совпадений с образцами не обнаружено. В противном случае возвращается значение, выдаваемое последней командой из соответствующего списка.

Следующий пример использования оператора case заимствован из системного скрипта /etc/rc.d/rc.sysinit.

case "$UTC" in

yes|true)

CLOCKFLAGS="$CLOCKFLAGS -u";

CLOCKDEF="$CLOCKDEF (utc)";

;;

no|false)

CLOCKFLAGS="$CLOCKFLAGS -localtime";

CLOCKDEF="$CLOCKDEF (localtime)";

;;

esac

Если переменная принимает значение yes или true, то будет выполнена первая пара команд, а если ее значение равно no или false - вторая пара.

5.8.4 Оператор select

Оператор select позволяет организовать интерактивное взаимодействие с пользователем. Он имеет следующий формат:

select name [in word;] do list; done

Вначале из шаблона word формируется список слов, соответствующих шаблону. Этот набор слов выводится в стандартный поток ошибок, причем каждое слово сопровождается порядковым номером. Если шаблон word пропущен, таким же образом выводятся позиционные параметры. После этого выдается стандартное приглашение PS3, и оболочка ожидает ввода строки на стандартном вводе. Если введенная строка содержит число, соответствующее одному из отображенных слов, то переменной name присваивается значение, равное этому слову. Если введена пустая строка, то номера и соответствующие слова выводятся заново. Если введено любое другое значение, переменной name присваивается нулевое значение. Введенная пользователем строка запоминается в переменой REPLY. Список команд list выполняется с выбранным значением переменной name.

Вот небольшой скрипт:

#!/bin/sh

echo "Какую ОС Вы предпочитаете?"

select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do

break

done

echo "Вы бы выбрали $var"

Если сохранить этот текст в файле, сделать файл исполняемым и запустить, на экран будет выдан следующий запрос:

Какую ОС Вы предпочитаете?

1) Linux

2) Gnu Hurd

3) Free BSD

4) Other

#?

Нажмите любую из 4 предложенных цифр (1,2,3,4). Если вы, например, введете 1, то увидите собщение:

“Вы бы выбрали Linux”

5.8.5 Оператор for

Оператор for работает немного не так, как в обычных языках программирования. Вместо того, чтобы организовывать увеличение или уменьшение на единицу значения некоторой переменной при каждом проходе цикла, он при каждом проходе цикла присваивает переменной очередное значение из заданного списка слов. В целом конструкция выглядит примерно так:

for name in words do list done.

Правила построения списков команд (list) такие же, как и в операторе if.

Пример. Следующий скрипт создает файлы foo_1, foo_2 и foo_3:

for a in 1 2 3; do

touch foo_$a

done

В общем случае оператор for имеет формат:

for name [in word;] do list; done

Вначале производится раскрытие слова word в соответствии с правилами раскрытия выражений, приведенными выше. Затем переменной name поочередно присваиваются полученные значения, и каждый раз выполняется список команд list. Если "in word" пропущено, то список команд list выполняется один раз для каждого позиционного параметра, который задан.

В Linux имеется программа seq, которая воспринимает в качестве аргументов два числа и выдает последовательность всех чисел, расположенных между заданными. С помощью этой команды можно заставить for в bash работать точно так же, как аналогичный оператор работает в обычных языках программирования. Для этого достаточно записать цикл for следующим образом:

for a in $(seq 1 10); do

cat file_$a

done

Эта команда выводит на экран содержимое 10-ти файлов: "file_1",…, "file_10".

5.8.6 Операторы while и until

Оператор while работает подобно if, только выполнение операторов из списка list2 циклически продолжается до тех пор, пока верно условие, и прерывается, если условие не верно. Конструкция выглядит следующим образом:

 while list1 do list2 done.

Пример:

while [-d mydirectory]; do

ls -l mydirectory ›› logfile

echo -- SEPARATOR -- ›› logfile

sleep 60

done

Такая программа будет протоколировать содержание каталога "mydirectory" ежеминутно до тех пор, пока директория существует.

Оператор until аналогичен оператору while:

until list1 do list2 done.

Отличие заключается в том, что результат, возвращаемый при выполнении списка операторов list1, берется с отрицанием: list2 выполняется в том случае, если последняя команда в списке list1 возвращает ненулевой статус выхода.

5.8.7 Функции

Синтаксис

Оболочка bash позволяет пользователю создавать собственные функции. Функции ведут себя и используются точно так же, как обычные команды оболочки, т. е. мы можем сами создавать новые команды. Функции конструируются следующим образом:

1 ... 33 34 35 36 37 38 39 40 41 ... 149
На этой странице вы можете бесплатно читать книгу Linux для пользователя - Виктор Костромин бесплатно.

Оставить комментарий