
- •4. Основы программирования на командном языке (sh)
- •4.1. Переменные Shell
- •4.2. Присваивание значений переменным
- •4.3. Вывод содержимого переменных
- •4.4. Специальные символы
- •4.4.1. Кавычки
- •4.4.2. Двойные кавычки
- •4.7. Построим простейшую Shell-процедуру (командный файл)
- •4.8. Специальные параметры интерпретатора команд
- •4.9. Простые условные операторы
- •4.9.1. And-if (&&) – Условное и
- •4.9.2. Or-if (||) – Условное или
- •4.10. Команда test
- •4.10.1. Cравнение строк
- •4.10.2. Cравнение чисел
- •4.10.3. Проверка состояния файла
- •4.10.4. Использование команды test в операторе if
- •4.11. Управляющие конструкции высокого уровня
- •4.11.1. Условный оператор (if)
- •4.12. Операторы цикла (for и while)
- •4.12.1. Оператор цикла for
- •Пример_1: Процедура print1 печатает (выводит в стандартный вывод) три файла, перечисленные в списке значений цикла for.
- •4.12.2. Оператор цикла while
- •4.13. Оператор выбора case
- •4.14. Арифметические операции с переменными Shell
- •4.15 Стандартные переменные Shell
- •4.16 Экспортирование переменных
- •4.17 Встроенные команды интерпретатора sh
- •4.18. Системные файлы
- •4.19. Запуск и режимы работы sh
4.10. Команда test
Формат команды:
test <выражение>
Команда test вычисляет <выражение> и, если его значение ИСТИНА, возвращает код завершения 0 (True); иначе – ненулевое значение (false).
Используется :
для сравнения строк и чисел;
для проверки состояния файла;
в операторе if.
4.10.1. Cравнение строк
Формат команды test для сравнения строк:
%test строка1=строка2 # проверка на равенство
%test строка1!=строка2 # проверка на неравенство
Пример_1: проверка регистрационного имени пользователя
%test "$LOGNAME"!="fomin"
Пример_2: проверка на пустой аргумент команды
%test "$1"=""
Пример_3: проверка дня недели:
%test "`date+%a`"="Wed"
Здесь date+%a –команда получения текущей даты, в которой форматная строка (+%a) ограничивает вывод команды только названием дня недели.
4.10.2. Cравнение чисел
Формат команды test для сравнения чисел:
test число1 <оператор> число2
Операторы указываются в соответствии со следующей таблицей:
Наименование оператора |
Математический вид оператора |
Оператор в команде test |
равно |
═ |
-eq |
не равно |
≠ |
-ne |
меньше |
< |
-lt |
меньше или равно |
≤ |
-le |
больше |
> |
-gt |
больше или равно |
≥ |
-ge |
Пример_1: проверка кода возврата последней выполненной команды на 0.
test "$?" -eq 0
Пример_2: проверка текущей даты на 20 число
test "`date+%d`" -eq 20
Здесь date+%d –команда получения текущей даты, в которой форматная строка (+%d) ограничивает вывод команды только числом.
4.10.3. Проверка состояния файла
В случае использования команды test для проверки состояния файла <выражение> может состоять из следующих примитивов:
-r файл - истина если файл существует и доступен для чтения;
-w файл - истина если файл существует и доступен для записи;
-x файл - истина если файл существует и доступен для выполнения;
-f файл - истина если файл существует и является обычным файлом;
-d файл - истина если файл существует и является каталогом;
-c файл - истина если файл существует и является специальным символьно-ориентированным файлом;
-b файл - истина если файл существует и является специальным блок-ориентированным файлом.
4.10.4. Использование команды test в операторе if
Команда test часто используется в составе условного оператора в командных процедурах.
if [test "`date+%d`" -eq 24]
then
echo OK
fi
4.11. Управляющие конструкции высокого уровня
4.11.1. Условный оператор (if)
Формат простого оператора if:
if условие
then
команда
команда
. . . . . . .
fi
Если условие истинно (True), команды, которые находятся между служебными словами then и fi будут исполнены, в противном случае они будут пропущены.
Условие представляет собой некоторое выражение, которое может быть заключено в квадратные скобки:
[условное_выражение]
Кроме того, в выражении могут применяться операторы –a (AND) и –o (OR).
Пример:
[$i –gt 7 –a $i –le 99]
По сути мы использовали команду test, однако применение квадратных скобок позволяет не указывать имени команды.
Приведенное выражение будет верно только в том случае, если переменная i > 7 и i ≤ 99.
Формат расширенного оператора if:
if условие
then
команда
команда
. . . . . . .
else
команда
команда
. . . . . . .
fi
Пример_1: Командная процедура (назовём её who2), выводящая сведения о работе в данный момент одного из зарегистрированных в системе пользователей.
if
who | grep "$1" > /dev/null
then
echo "$1 is logged on"
else
echo "$1 is not logged on"
fi
Запуск командной процедуры предполагает задание имени пользователя в качестве параметра:
%who2 petrov
если пользователь petrov работает в системе в момент запуска процедуры who2, то будет выведено сообщение
petrov is logged on (Петров вошёл в систему)
в противном случае будет выведено сообщение
petrov is not logged on (Петров не вошёл в систему)
В качестве условия в команде if используется конвейер из двух команд:
who - выводит в стандартный вывод сведения о работающих в настоящее время пользователях с указанием времени входа в систему;
grep – пропускает на выход только те строки из вывода команды who, в которых встречается заданный в качестве формального параметра $1 имени пользователя.
Пример_2: Вывести напоминание об уплате налогов.
if
test "`date+%d`" -eq 1
then
echo pay bills
fi