- •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.12. Операторы цикла (for и while)
Все языки программирования включают механизм, который позволяет многократно повторять группу операторов.
4.12.1. Оператор цикла for
Формат оператора цикла for:
for переменная in список
do
команда
команда
. . . . . . .
done
Список команд, заключенный между ключевыми словами do . . . done выполняется один раз для каждого значения из списка. При этом очередное выбираемое значение из списка присваивается переменной, имя которой указано слева от ключевого слова in.
Список значений может задаваться символьными константами и значением некоторой переменной, содержащей последовательность, разбиваемую разделителями.
Пример_1: Процедура print1 печатает (выводит в стандартный вывод) три файла, перечисленные в списке значений цикла for.
for file
in otchet pismo spravka
do
echo "printing $file"
more "$file"
done
Пример_2: Процедура print2 печатает файлы, перечисленные в командной строке (%print2 spravka otchet). В списке значений цикла for использована переменная '*', содержащая список позиционных параметров, т.е. имена файлов spravka и otchet.
for file
in $*
do
echo "printing $file"
more "$file"
done
Пример_3: Процедура print3 печатает, список которых получен командой ls.
for file
in `ls`
do
echo "printing $file"
more "$file"
done
4.12.2. Оператор цикла while
Формат оператора цикла while:
while условие
do
команда
команда
. . . . . . .
done
Оператор while повторяет заданную группу команд, если условие выполнения соответствует Истине. Поскольку условие проверяется перед выполнением списка команд, возможна ситуация, когда список не будет выполнен ни разу.
Пример_1:Предположим, что необходимо разработать командную процедуру, которая сравнивает содержимое некоторого файла-образца с содержимым с другими файлами из списка и сообщает имя первого файла, с которым образец не совпал.
Пусть эта процедура вызывается на выполнение так:
%cmplist file1 file2 file3 . . .
где – file1 – файл-образец;
file3 file3 . . . – файлы для сравнения.
Текст командной процедуры cmplist:
i=$1
while cmp $i $2
do
shift
done
echo $2
Процедура cmplist работает следующим образом. Сначала переменной i присваивается значение первого позиционного параметра (это имя файла-образца). Условие выполнения цикла while формируется командой cmp – сравнить файлы. У этой команды два операнда – сравниваемые файлы. Если файлы совпали, команда cmp вырабатывает код возврата Истина и выполняются команды из тела цикла (do . . . done), в противном случае выполнение цикла завершается и выводится имя первого файла, содержимое которого не совпало с содержимым файла-образца.
Тело цикла в данной командной процедуре на редкость простое и короткое. В нем применена встроенная команда интерпретатора shift, которая сдвигает список позиционных параметров влево на одну позицию. Сначала этот список выглядит следующим образом:
$1 $2 $3 $4
file1 file2 file3
В первых трех параметрах разместились имена файлов, заданных в качестве аргументов командной процедуры. После однократного выполнения команды shift список параметров будет выглядеть так:
$1 $2 $3 $4
file2 file3
Таким образом, при первом выполнении командной процедуры сравнивались файлы file1 и file2 (их имена находились в переменной i и втором позиционном параметре). При втором выполнении цикла сравнивались уже файлы file1 и file3, и имена этих файлов по-прежнему находились в переменной i и втором позиционном параметре.
Оператор break используется в циклах для досрочного выхода из цикла.
Пример_2: Разработаем командную процедуру (пусть она называется copy2), которая читает строки со стандартного ввода и размещает их в файле dump. Ввод прекращается, если введена строка, состоящая из одного символа 'q'.
while
echo "Enter words [Type q, to quit]"
read line
do
if test "$line"="q"
then
break
else
echo "$line" >> dump
fi
done
Оператор if может быть записан без применения встроенной команды test:
if ["$line"="q"]
Оператор continue используется для пропуска команд до конца цикла. При этом осуществляется переход на начало цикла.
Пример_3: модифицируем командную процедуру copy2 так, чтобы она не записывала в файл dump пустые строки. Новую версию командной процедуры назовём copy3.
while
echo "Enter words [Type q, to quit]"
read line
do
if test "$line"="q"
then
break
fi
if test "$line"=""
then continue
else
echo "$line" >> dump
fi
done