Программирование на языке SHELL (OS UNIX)Рефераты >> Программирование и компьютеры >> Программирование на языке SHELL (OS UNIX)
Примеры.
x="who is who"; export x; [ "who is who" = "$x" ]; echo $?
0
x=abc ; export x ; [ abc = "$x" ] ; echo $?
0
x=abc ; export x ; [ -n "$x" ] ; echo $?
0
x="" ; export x ; [ -n "$x" ] ; echo $?
1
Кроме того, существуют два стандартных значения условия, которые могут использоваться вместо условия (для этого не нужны скобки).
УСЛОВИЯ СРАВНЕНИЯ ЦЕЛЫХ ЧИСЕЛ:
x -eq y |
"x" равно "y", |
x -ne y |
"x" неравно "y", |
x -gt y |
"x" больше "y", |
x -ge y |
"x" больше или равно "y", |
x -lt y |
"x" меньше "y", |
x -le y |
"x" меньше или равно "y". |
СЛОЖНЫЕ УСЛОВИЯ:
Реализуются с помощью типовых логических операций:
! |
(not) инвертирует значение кода завершения. |
-o |
(or) соответствует логическому "ИЛИ". |
-a |
(and) соответствует логическому "И". |
4.2. Условный оператор "if"
В общем случае оператор "if" имеет структуру
if условие
then список
[elif условие
then список]
[else список]
fi
Здесь "elif" сокращенный вариант от "else if" может быть использован наряду с полным, т.е. допускается вложение произвольного числа операторов "if" (как и других операторов). Разумеется "список" в каждом случае должен быть осмысленный и допустимый в данном контексте.
Самая усеченная структура этого оператора
if условие
then список
fi
если выполнено условие (как правило это ком получен код завершения "0", то выполняется "список", иначе он пропускается.
Примеры.
Пусть написан "if-1"
if [ $1 -gt $2 ]
then pwd
else echo $0 : Hello!
fi
Тогда вызов if-1 12 11 даст /home/sae/STUDY/SHELL
а if-1 12 13 даст if-1 : Hello!
4.3. Оператор вызова ("case")
Оператор выбора "case" имеет структуру:
case строка in
шаблон) список команд;;
шаблон) список команд;;
.
шаблон) список команд;;
esac
Здесь "case" "in" и "esac" - служебные слова. "Строка" (это может быть и один символ) сравнивается с "шаблоном". Затем выполняется "список команд" выбранной строки.
Непривычно выглядят в конце строк выбора ";;", но написать здесь ";" было бы ошибкой. Для каждой альтернативы может быть выполнено несколько команд. Если эти команды будут записаны в одну строку, то символ ";" будет использоваться как разделитель команд.
Обычно последняя строка выбора имеет шаблон "*", что в структуре "case" означает "любое значение". Эта строка выбирается, если не произошло совпадение значения переменной (здесь $z) ни с одним из ранее записанных шаблонов, ограниченных скобкой ")". Значения просматриваются в порядке записи.
4.4. Оператор цикла с перечислением ("for")
Оператор цикла "for" имеет структуру:
for имя [in список значений]
do
список команд
done
где "for" - служебное слово определяющее тип цикла,
"do" и "done" - служебные слова, выделяющие тело цикла.
Пусть команда "lsort" представлена командным файлом
for i in file_1 file_2 file_3
do
proc_sort $i
done
В этом примере имя "i" играет роль параметра цикла. Это имя можно рассматривать как shell-переменную, которой последовательно присваиваются перечисленные значения (i=file_1, i=file_2, i=file_3), и выполняется в цикле команда "proc_sort".
Часто используется форма "for i in *", означающая "для всех файлов текущего каталога".
Пусть "proc_sort" в свою очередь представляется командным файлом
cat $1 | sort | tee /dev/lp > ${1}_sorted
т.е. последовательно сортируются указанные файлы, результаты сортировки выводятся на печать ("/dev/lp") и направляются в файлы file_1_sorted file_2_sorted и file_3_sorted
4.5. Оператор цикла с истинным условием ("while")
Структура "while", также обеспечивающая выполнение расчетов, предпочтительнее тогда, когда неизвестен заранее точный список значений параметров или этот список должен быть получен в результате вычислений в цикле.
Оператор цикла "while" имеет структуру:
while условие
do
список команд
done
где "while" - служебное слово определяющее тип цикла с истинным условием. Список команд в теле цикла (между "do" и "done") повторяется до тех пор, пока сохраняется истинность условия (т.е. код завершения последней команды в теле цикла равен "0") или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие должно выполняться.
Команда "break [n]" позволяет выходить из цикла. Если "n" отсутствует, то это эквивалентно "break 1". "n" указывает число вложенных циклов, из которых надо выйти, например, "break 3" - выход из трех вложенных циклов.
В отличие от команды "break" команда "continue [n]" лишь прекращает выполнение текущего цикла и возвращает на НАЧАЛО цикла. Она также может быть с параметром. Например, "continue 2" означает выход на начало второго (если считать из глубины) вложенного цикла.
Команда "exit [n]" позволяет выйти вообще из процедуры с кодом возврата "0" или "n" (если параметр "n" указан). Эта команда может использоваться не только в циклах. Даже в линейной последовательности команд она может быть полезна при отладке, чтобы прекратит выполнение (текущего) расчета в заданной точке.