П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 182403 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 81878 раз(а).

Учебник HTML.
Просмотров 76911 раз(а).

Руководство по PHP5.
Просмотров 47892 раз(а).

Хостинг через призму DNS.
Просмотров 55485 раз(а).

Подборка текстов стандартных документов.
Просмотров 47349 раз(а).

Учебник PHP - Самоучитель
Просмотров 53841 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 54552 раз(а).

Внешние атаки...
Просмотров 44141 раз(а).

Учебник PHP.
Просмотров 39473 раз(а).

SSI в примерах.
Просмотров 29334 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





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

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

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

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

Пусть команда "lsort" представлена командным файлом

    for i in f1 f2 f3
    do
      proc-sort $i
    done

В этом примере имя "i" играет роль параметра цикла. Это имя можно рассматривать как shell-переменную, которой последовательно присваиваются перечисленные значения (i=f1, i=f2, i=f3), и выполняется в цикле команда "procsort".

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

Пусть "proc-sort" в свою очередь представляется командным файлом

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

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

Можно сделать более универсальной команду "lsort", если не фиксировать перечень файлов в команде, а передавать произвольное их число параметрами.

Тогда головная программа будет следующей:

  for i
      do
	 proc-sort $i
      done

Здесь отсутствие после "i" служебного слова "in" с перечислением имен говорит о том , что список поступает через параметры команды. Результат предыдущего примера можно получить, набрав

  lsort f1 f2 f3

Усложним ранее рассматривавшуюся задачу (под именем "case-2") определения холдинга фирмы. Теперь можно при вызове указывать произвольное количество фирм. При отсутствии в структуре оператора "for" фрагмента "in список значений", значения берутся из параметров вызывающей команды.

    ###
    # holding: Справочник.
    #          Для различных фирм по имени выдается
    #          название холдинга, в который она входит
    for i
	 do
	     case $i in
			 ONE|TWO|THREE) echo Холдинг: ZERO    ;;
			       MMM|WWW) echo Холдинг: Not-Net ;;
		     Hi|Hello|Howdoing) echo Холдинг: Привет! ;;
				     *) echo Нет такой фирмы  ;;
	     esac
	 done
При вызове "holding Hello HELLO ONE" на экране будет:
    Холдинг: Привет!
    Нет такой фирмы
    Холдинг: Not-Net
Еще пример.
    ###
    # subdir: Выдает имена всех поддиректориев
    #         директория с именем $dir
	     for i in $dir/*
	     do
		if [ -d  $i ]
		   then echo $i
		fi
	     done

Следующий расчет иллюстрирует полезный, хотя и с долей трюкачества, способ повторения одних и тех же действий несколько раз. Переменная "i" принимает здесь пять значений: 1, 2, 3, 4, 5, но внутри цикла эта переменная отсутствует и поэтому ее значение никакой роли не играет и ни чего не меняет. С таким же успехом переменная "i" могла принимать значения, скажем ф о к у с , а в результате точно также было бы пять раз повторено одно и то же вычисление содержимого цикла без изменений.

    ###
    # print-5: Организации пятикратного выполнения команды
    for i in 1 2 3 4 5
	do
	   cat file-22 > /dev/lp
	done

Расчет "print-n" иллюстрирует еще одну полезную возможность в использовании цикла "for". Здесь, после "for i ...", отсутствуют "in ..." и перечень имен, т.е. перечнем имен для "i" становится перечень параметров, а следовательно количество печатаемых экземпляров можно менять.

    ###
    # print-n: Задание числа копий
    #          через параметры
    for i
	  do
		  cat file-22 > /dev/lp
	  done
Смысл не изменится, если первую строку расчета записать как
	for i in $*
поскольку значение "$*" - есть список значений параметров.

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

Пусть командный файл "cmp" имеет вид:

    for i in "$*"
      do
	   echo $i
      done
    echo
    for i in "$@"
	do
	   echo $i
	done
При вызове
    cmp aa bb cc
на экран будет выведено
    aa bb cc
    aa
    bb
    cc

[Назад] [Содержание] [Вперед]



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту: