Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
case $WHEN in Monday|MONDAY|mon);;
Sunday|SUNDAY|sun);;
Saturday|SATURDAY}sat);;
*) echo " Are you nuts!, this report can only be run on " >&2
echo " on a Saturday, Sunday or Monday" >&2
exit 1
esac
echo "Report to run on $WHEN"
# здесь команда для выполнения действительного отчета
При корректных начальных данных получим:
$ caserep
Weekly Report What day do you want to run report [Saturday] : validating..Saturday Report to run on Saturday
Если начальные данные были неправильны, получим:
$ caserep
Weekly Report What day do you want to run report [Saturday] :Tuesday validating..Tuesday
Are you nuts! this report can only be run on a Saturday, Sunday or Monday
Можно заключить, что оператор case функционирует так же, как и несколько операторов if then else. Такой вывод вполне правомерен.
18.5. Цикл for
Общий формат цикла:
for имя_перемениой in list
do
команда1 команда…
done
Цикл for однократно обрабатывает всю информацию для каждого значения, включенного в список list. Чтобы получить доступ к каждому значению в списке, достаточно задать параметр имя_переменной. Командой служит любая действительная команда или оператор интерпретатора shell. В качестве параметра имя_переменной можно указать любое слово.
Применение опции in list не является обязательным; если не включать эту часть, цикл воспользуется позиционными параметрами командной строки.
Опция in list может содержать подстановки, строки и имена файлов. Рассмотрим несколько примеров.
18.5.1. Простой цикл for
Этот цикл просто выводит на экран список, который состоит из " 1 2 3 4 5". Чтобы получить доступ к каждой переменной, в качестве параметра имя_переменной указывается "loop".
$ pg for_i
#!/bin/sh
# for_i
for loop in 1 2 3 4 5
do
echo $LOOP done
Приведенный выше сценарий выводит следующие данные:
$ for_i
1
2
3
4
5
18.5.2. Вывод на экран строки списка
Ниже приводится цикл for, список которого содержит строку значений "orange red blue grey". Для каждой переменной указана команда echo, в качестве параметра имя_переменной указывается loop. Команда echo с помощью части $LOOP выводит на экран каждое значение списка до тех пор, пока список не окажется пустым.
$ pg forlist
#!/bin/sh
# forlist
for LOOP in orange red blue grey
do
echo $LOOP
done
$ forlist
orange
red
blue
grey
Также с помощью цикла имя_переменной можно комбинировать строки (в данном случае речь идет о цикле loop).
echo "this ls the fruit $LOOP"
Результат:
This ls the fruit orange red blue grey
18.5.3. Использование команды ls совместно с циклом for
Этот цикл оценивает команду ls интерпретатора shell и отображает сведения о файлах текущего каталога.
$ pg forls
#!/bin/sh
# forls
for loop in `ls`
do
echo $LOOP
done
$ forls
array
arrows
center
center1
center2
centerb
18.5.4. Применение параметров вместе с циклом for
Если в цикле for опустить часть in list, позиционные параметры командной строки становятся аргументами. Действительно, этот подход аналогичен следующему:
for params in "[email protected]"
или
for params in "$*"
Ниже приводится пример, который показывает, как можно избежать применения конструкции in list. Цикл for обращается к специальному параметру [email protected] или $* для получения аргументов из командной строки.
$ pg forparam2
#/bin/sh
# forparam2
for params in $*
do
echo "You supplied $params as a command line option"
done
echo $params done
$ forparam2 myfile1 myfile2 myfile3
You supplied myfile1 as a command line option
You supplied myfile2 as a command line option
You supplied myfile3 as a command line option
Следующий сценарий содержит часть in "[email protected]" и образует тот же самый поток вывода, что и предыдущий сценарий.
$ pg forparam3
#!/bin/sh
# forparam3
for params in [email protected]
do
echo "You supplied $params as a command line option"
done
echo $params done
Если развить этот подход далее и осуществлять поиск набора файлов, то совместно с циклом for можно применять команду find . При передаче всех файлов используют преимущество параметра командной строки.
$ pg forfind
#!/bin/sh
# forfind
for LOOP in [email protected]
do
find / -name $LOOP -print
done
Значения передаются с помощью параметра командной строки и образуют часть -name команды find .
$ forfind passwd LPSO.AKSOP
/etc/passwd
/etс/pam.d/passwd
/etc/uucp/passwd
/usr/bin/passwd
/usr/local/accounts/LPSO.AKSOP
18.5.5. Посылка сигналов серверам с помощью цикла for
Поскольку цикл for может обработать каждое слово списка, установим переменную для отображения названий некоторых серверов сети. Воспользуемся циклом for для посылки сигналов каждому из этих серверов.
$ pg forping
#!/bin/sh
# forping
HOSTS=”1itserv dnssevr acctsmain ladpd ladware"
for loop in $HOSTS
do
ping -c 2 $LOOP
done
18.5.6. Создание резервных копий файлов с помощью цикла for
Цикл for можно использовать для создания резервных копий файлов. При этом переменная просто добавляется к целевому аргументу команды ср. Ниже применяется переменная под названием ВАК. Эта переменная добавляется к каждому имени целевого файла при использовании цикла с помощью команды ср. Список включает shell–команду ls.
$ pg forcp
#!/bin/sh
# forcp
BAK=".bak"
for loop in `ls`
do
echo "copying $LOOP to $LOOP$BAK"
cp $LOOP $LOOP$BAK done
$ forcp
copying array to array.bak
copying arrows to arrows.bak
copying center to center.bak
copying center1 to center1.bak
18.5.7. Массовое преобразование
Чтобы найти все файлы, которые начинаются символами "LPSO", и преобразовать их содержимое в символы верхнего регистра, используются команды ls и cat. Команда ls отображает список файлов, а команда cat применяется для передачи списка команде tr. Передаваемые файлы получают расширение UC. Обратите внимание, что при использовании в цикле for команды ls применяются обратные кавычки.
$ pg forUC
#!/bin/sh
# forUC
for files in Us LPSO*'
do
cat $files | tr "[a‑z]" "[A‑Z]" > $files.UC
done
18.5.8. Удаления, выполняемые с помощью редактора sed
В следующем примере для удаления всех пустых строк применяется потоковый редактор sed. Выходной поток данных направляется в новые файлы с расширением .HOLD. Затем команда mv возвращает файлам их исходные имена.
$ pg forsed
#!/bin/sh
# forsed
for files in `ls LPSO*` do
sed -e "/^$/d" $files > $files. HOLD
mv $flies. HOLD $files
done
18.5.9. Подсчет с помощью циклов
При обсуждении команды expr отмечалось, что эта команда применяется, если в циклы необходимо ввести счетчики. Ниже рассматривается пример, в котором цикл for обрабатывает файлы, а вывод и подсчет количества файлов осуществляется с помощью команды ls.