Искусство программирования на языке сценариев командной оболочки
Шрифт:
Пример 10-2. Цикл for с двумя параметрами в каждом из элементов списка
#!/bin/bash
# Список планет.
# Имя кажой планеты ассоциировано с расстоянием от планеты до Солнца (млн. миль).
for planet in "Меркурий 36" "Венера 67" "Земля 93" "Марс 142" "Юпитер 483"
do
set -- $planet #
# Конструкция "--" предохраняет от неожиданностей, если $planet "пуста" или начинается с символа "-".
# Если каждый из аргументов потребуется сохранить, поскольку на следующем проходе они будут "забиты" новыми значениями,
# То можно поместить их в массив,
# original_params=("$@")
echo "$1 в $2,000,000 миль от Солнца"
#----две табуляции---к параметру $2 добавлены нули
done
# (Спасибо S.C., за разъяснения.)
exit 0
В качестве списка, в цикле for, можно использовать переменную.
Пример 10-3. Fileinfo: обработка списка файлов, находящегося в переменной
#!/bin/bash
# fileinfo.sh
FILES="/usr/sbin/privatepw
/usr/sbin/pwck
/usr/sbin/go500gw
/usr/bin/fakefile
/sbin/mkreiserfs
/sbin/ypbind" # Список интересующих нас файлов.
# В список добавлен фиктивный файл /usr/bin/fakefile.
echo
for file in $FILES
do
if [ !
– e "$file" ] # Проверка наличия файла.
then
echo "Файл $file не найден."; echo
continue # Переход к следующей итерации.
fi
ls -l $file | awk '{ print $8 " размер: " $5 }' # Печать 2 полей.
whatis `basename $file` # Информация о файле.
echo
done
exit 0
В [списке]
Пример 10-4. Обработка списка файлов в цикле for
#!/bin/bash
# list-glob.sh: Создание список файлов в цикле for с использованием
# операции подстановки имен файлов ("globbing").
echo
for file in *
do
ls -l "$file" # Список всех файлов в $PWD (текущем каталоге).
# Напоминаю, что символу "*" соответствует любое имя файла,
# однако, в операциях подстановки имен файлов ("globbing"),
# имеются исключения -- имена файлов, начинающиеся с точки.
# Если в каталоге нет ни одного файла, соответствующего шаблону,
# то за имя файла принимается сам шаблон.
# Чтобы избежать этого, используйте ключ nullglob
# (shopt -s nullglob).
# Спасибо S.C.
done
echo; echo
for file in [jx]*
do
rm -f $file # Удаление файлов, начинающихся с "j" или "x" в $PWD.
echo "Удален файл \"$file\"".
done
echo
exit 0
Если [список] в цикле for не задан, то в качестве оного используется переменная $@ -- список аргументов командной строки. Оень остроумно эта особенность проиллюстрирована в Пример A-18.
Пример 10-5. Цикл for без списка аргументов
#!/bin/bash
# Попробуйте вызвать этот сценарий с аргументами и без них и посмотреть на результаты.
for a
do
echo -n "$a "
done
# Список аргументов не задан, поэтому цикл работает с переменной '$@'