Перенаправление ввода-вывода
Три направления ввода-вывода являются выделенными - стандартный ввод, вывод и поток ошибок (stdin, stdout, stderr). По умолчанию, все три потока связаны (ассоциированы) с терминалом. При этом программа выводит все свои сообщения в том числе и об ошибках на терминал. Shell позволяет перенаправить эти стандартные потоки, установить ввод-вывод и объединение потоков.
Перенаправление потоков ввода-вывода.
>file Перенаправление стандартного потока вывода в файл file
>>file -Перенаправление стандартного потока вывода в файл file с добавлением в конец файла.
<file -получение стандартного потока ввода из файла file.
prog1 | prog2 -Передача выходного потока программы prog1 во входной поток программы prog2.
n>file -Перенаправление стандартного потока с дескриптором n в файл file.
n>>file -Перенаправление стандартного потока с дескриптором n в файл file с добавлением в конец файла.
n>&m -Объединение потоков с дескрипторами n и m.
Пример:
$ prog1 >/dev/null 2>&1
/dev/null - это псевдоустройство, которое уничтожает направленный в него поток.
Передача потока вывода одной программы в поток ввода другой используется часто. Например:
$ gzip -d archive.tar.gz | tar –xf
Здесь происходит разархивация файла archive.tar.gz, запакованного двумя архиваторами. Выходной поток от утилиты gzip передается во входной поток утилите tar. Аналогично эту же операцию можно было выполнить и по другому:
$ gzip -d archive.tar.gz
$ tar -xf archive.tar
Поскольку язык Bourne Shell является процедурным языком программирования, в нем также как и в других подобных языках есть операторы, позволяющие управлять последовательностью выполнения команд. Необходимым оператором является проверка некоторого условия, в зависимости от выполнения которого определяется дальнейший ход программы. Таким оператором является команда test. Эта команда проверяет выполнение некоторого условия. У команды test существует два варианта вызова:
test условие
или
[ условие ]
Следует отметить, что между скобкой и условием необходимо наличие пробелов, иначе Shell не сможет опознать "[" как команду test. При успешном завершении test возвращает "0".
Условия проверки файлов:
-f file Файл "file" является обычным файлом.
-d file Файл "file" является каталогом.
-c file Файл "file" является специальным файлом.
-r file Файл "file" имеет разрешение на чтение.
-w file Файл "file" имеет разрешение на запись.
-x file Файл "file" имеет разрешение на исполнение.
-s file Файл "file" не пустой.
Условия проверки строк:
string1=string2 Строки string1 и string2 совпадают.
string1!=string2 Строки string1 и string2 не совпадают.
-n string1 Строка string1 существует.
-z string1 Строка string1 не существует.
Условия операций с целыми числами:
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
В этом случае команда test воспринимает строки именно как целые числа. Нулевому значению так же соответствует пустая строка.
Логические операции в контексте test
! (not) Логическое "НЕ"
-o (or) Логическое "ИЛИ"
-a (and) Логическое "И"
Условный оператор "if"
Общий вид использования условного оператора if представляется следующим образом:
if <условие>
then <список команд>
[ elif <условие>
then <список> ]
[else <список> ]
Fi
Выражения, выделенные в квадратных скобках, являются необязательными. Т.е. можно представить наиболее употребительную "порезанную" модификацию условного оператора:
if <условие>
then <список команд>
fi
В этом случае если <условие> выполнено (код завершения 0 ) то выполняется <список команд>. В противном случае <список команд> пропускается.
Оператор выбора case
В общем случае синтаксис оператора case выглядит следующим образом:
case <строка> in