![](/user_photo/2706_HbeT2.jpg)
- •15 Спо часть 1 Лек 1_4 (Кузнецова а.В.)
- •Командные интерпретаторы. Программирование на языке shell
- •Группировка команд.
- •Перенаправление команд
- •Генерация имен файлов
- •Специальные переменные
- •Условный оператор if
- •Оператор вызова (case)
- •Оператор цикла с перечислением (for)
- •Оператор цикла с истинным условием (while)
- •Оператор цикла с ложным условием (until)
Оператор цикла с перечислением (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