COUNTER=`expr $COUNTER + 1`
echo $COUNTER
done
Указанный сценарий выводит на экран числа от 1 до 5, затем завершает работу.
$ whilecount
1 2 3
4
5
Цикл while может применяться для ввода информации с клавиатуры. В следующем примере введенная информация присваивается переменной film. Если нажать клавиши [Ctrl+D], цикл завершает выполнение.
$ pg whileread
#!/bin/sh
# whileread
echo " type
echo -n "enter your most liked film :"
while read FILM
do
echo "Yeah, great film the $FILM"
done
Когда сценарий выполняется, вводимыми данными могут быть:
$ whileread
enter your most liked film: Sound of Music
Yeah, great film the Sound of Music
Обычно цикл while используется для считывания данных из файла, что позволяет сценарию обрабатывать информацию.
Предположим, что следует просмотреть информацию из следующего персонального файла, содержащего имена служащих, их ID и названия отделов.
$ pg names.txt
Louise Conrad:Accounts:ACC8987
Peter James:Payroll:PR489
Fred Terms:Customer:CUS012
James Lenod:Accounts:ACC887
Frank Pavely:Payroll:PR489
Для хранения строк данных можно использовать переменные. Условие истинно до тех пор, пока не считываются новые данные. Для просмотра содержимого файла цикл while использует перенаправление потока данных ввода. Обратите внимание, что отдельной переменной $LINE присваивается целая строка.
$ pg whileread
#!/bin/sh
# whileread
while read LINE
do
echo $LINE
done < names.txt
$ whileread
Louise Conrad:Accounts:ACC8987
Peter James:Payroll:PR489
Fred Terras:Customer:CUS012
James Lenod:Accounts:ACC887
Frank Pavelу:Payroll:PR4 8 9
Чтобы при выводе данных устранить разделитель полей в виде двоеточия, примените переменную ifs, предварительно сохранив ее установки. После того как сценарий завершит работу с этими установками, восстановите установки переменной ifs. С помощью переменной ifs можно изменить разделитель полей на двоеточие вместо пробела или символа табуляции, которые заданы по умолчанию. Как известно, отдельной переменной можно присвоить значения трех полей: NAME, dept и id.
Чтобы улучшить внешний вид записей, немного увеличивая поля, можно с помощью команды echo применить символы табуляции. Рассмотрим сценарий:
$ pg whilereadifs
#!/bin/sh
#whilereadifs
#сохраните установку IFS
SAVEDIFS=$IFS
#присвоим переменной IFS новый разделитель
IFS=:
while read NAME DEPT ID
do
echo -e "$NAME\t $DEPT\t $ID" done < names.txt
# восстановим установки переменнойIFS
IFS=$SAVEDIFS
При выполнении сценария получим более привлекательный поток вывода:
$ whilereadifs
Louise Conrad Accounts ACC8987
Peter James Payroll PR489
Fred Terms Customer CUS012
James Lenod Accounts ACC887
Frank Pavely Payroll PR489
Большинство циклов while включает некоторый оператор проверки, который уточняет последовательность действий.
Ниже рассматривается файл с именами служащих, и на экран выводятся подробности. После обнаружения имени служащего "James Lenod" сценарий завершает работу. Вывод на экран подробностей до осуществления проверки позволяет удостовериться, что "James Lenod" добавляется в содержимое файла.
Обратите внимание, что все переменные задаются в начале сценария. При внесении небольших поправок в переменные можно сэкономить рабочее время и
сократить количество типов. Все редакторские правки находятся в начале, а не рассеяны по всему сценарию.
$ pg whileread_file
#!/bin/sh
#whileread_file
#инициализация переменных
SAVEDIFS=$IFS
IFS=:
HOLD_FILE=hold_file
NAME_MATCH="James Lenod"