Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_1_4_Командные интерпретаторы. Программирова...doc
Скачиваний:
9
Добавлен:
21.09.2019
Размер:
151.55 Кб
Скачать

Оператор цикла с перечислением (for)

Оператор цикла for имеет структуру:

for имя [in список значений]

do

список команд

done

где "for" - служебное слово, определяющее тип цикла, "do" и "done" - служебные слова, выделяющие тело цикла. Не забывайте про done! Фрагмент "in список значений" может отсутствовать. Имя можно рассматривать как shell-переменную, которой последовательно присваиваются значения из списка и для каждого выполняется список команд.

Пример.

for i in f1 f2 f3

do

cat $1 | sort | tee /dev/lp > ${1}_sorted

done

здесь переменная i последовательно принимает значения (i=f1, i=f2, i=f3), и последовательно сортируются указанные файлы, результаты сортировки выводятся на печать (/dev/lp) и направляются в файлы f1_sorted f2_sorted и f3_sorted.

Фрагмент "in список значений" может отсутствовать:

for i

do

cat $1 | sort | tee /dev/lp > ${1}_sorted

done

здесь отсутствие после i служебного слова in с перечислением имен говорит о том , что список поступает через параметры команды ($@). Результат предыдущего примера можно получить, набрав: myscript f1 f2 f3.

Различие в специальных переменных $* и $@, представляющих перечень параметров: первый представляет параметры, как строку, а второй, как совокупность слов.

Пример.

for i in $dir/* # выдает имена всех поддиректориев каталога с именем $dir

do

if [ -d $i ]

then echo $i

fi

done

for i in [jx]* # удаляет все файлы тек. каталога, удовлетворяющие шаблону [jx]*

do

rm –f $I

echo "removed file \"$I\""

done

Часто используется форма for i in *, означающая "для всех файлов текущего каталога".

Стандартный синтаксис

for a in 1 2 3 4 5 6 7 8

do

echo –n “$a “

done

Синтаксис встиле языки Си:

N=10

for ((a=1; a <= N ;a++)

do

echo –n “$a “

done

Оператор цикла с истинным условием (while)

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

while условие

do

список команд

done

где while - служебное слово определяющее тип цикла с истинным условием. Список команд в теле цикла (между do и done) повторяется до тех пор, пока сохраняется истинность условия (т.е. код завершения последней команды в теле цикла равен 0) или цикл не будет прерван изнутри специальными командами (break, continue или exit). При первом входе в цикл условие должно выполняться.

# напечатать 50 экземпляров файла myfile

n=0 # или ((n=0)) или let "n=0"”

while [ $n -lt 50 ] # пока n < 50

do

((n += 1)) #или let "n+=1" или n=$(($n+1)

cat myfile> /dev/lp

done

while

read str # читает строки до Ctrl+D

do

echo $str>>str_list # добавить в конец файла name_list

done

Команда expr тоже работает с shell-переменными как с целыми числами, а не как со строками: n=`expr $n + 1` т.е. при каждом выполнении значение "n" увеличивается на 1.

Команда exit [n] позволяет выйти вообще из процедуры с кодом возврата 0 или n (если параметр n указан). Эта команда может использоваться не только в циклах. Даже в линейной последовательности команд она может быть полезна при отладке, чтобы прекратит выполнение (текущего) расчета в заданной точке.

Рекомендуется свои скрипты завершать командой exit 0