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 "$@" и образует тот же самый поток вывода, что и предыдущий сценарий.
$ pg forparam3
#!/bin/sh
# forparam3
for params in $@
do
echo "You supplied $params as a command line option"
done
echo $params done
Если развить этот подход далее и осуществлять поиск набора файлов, то совместно с циклом for можно применять команду find . При передаче всех файлов используют преимущество параметра командной строки.
$ pg forfind
#!/bin/sh
# forfind
for LOOP in $@
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
Поскольку цикл for может обработать каждое слово списка, установим переменную для отображения названий некоторых серверов сети. Воспользуемся циклом for для посылки сигналов каждому из этих серверов.
$ pg forping
#!/bin/sh
# forping
HOSTS=”1itserv dnssevr acctsmain ladpd ladware"
for loop in $HOSTS
do
ping -c 2 $LOOP
done
Цикл 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
Чтобы найти все файлы, которые начинаются символами "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
В следующем примере для удаления всех пустых строк применяется потоковый редактор 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
При обсуждении команды expr отмечалось, что эта команда применяется, если в циклы необходимо ввести счетчики. Ниже рассматривается пример, в котором цикл for обрабатывает файлы, а вывод и подсчет количества файлов осуществляется с помощью команды ls.
$ pg forcount
#!/bin/sh # forcount counter=0
for files in *
do
# increment
counter=`expr $COUNTER + 1`
done
echo "There are $COUNTER files in `pwd` we need to process"
$ forcount
There are 45 files in /apps/local we need to process
Аналогичный результат можно получить с помощью команды wc.
$ ls |wc -l
45