Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

echo

done

exit 0

В [списке] цикла for могут быть использованы имена файлов, которые в свою очередь могут содержать символы-шаблоны.

Пример 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

# Список аргументов не задан, поэтому цикл работает с переменной '$@'

#+ (список аргументов командной строки, включая пробельные символы).

echo

exit 0

При создании списка аргументов, в цикле for допускается пользоваться подстановкой команд. См. Пример 12-39, Пример 10-10 и Пример 12-33.

Пример 10-6. Создание списка аргументов в цикле for с помощью операции

подстановки команд

#!/bin/bash

# уЩЫЬ for гЯ [гаЩгЫЯЭ], гЯкФСЮЮйЭ г аЯЭЯниР аЯФгдСЮЯзЫЩ ЫЯЭСЮФ.

NUMBERS="9 7 3 8 37.53"

for number in `echo $NUMBERS` # for number in 9 7 3 8 37.53

do

echo -n "$number "

done

echo

exit 0

Более сложный пример использования подстановки команд при создании списка аргументов цикла.

Пример 10-7. grep для бинарных файлов

#!/bin/bash

# bin-grep.sh: Поиск строк в двоичных файлах.

# замена "grep" для бинарных файлов.

# Аналогично команде "grep -a"

E_BADARGS=65

E_NOFILE=66

if [ $# -ne 2 ]

then

echo "Порядок использования: `basename $0` string filename"

exit $E_BADARGS

fi

if [ !
– f "$2" ]

then

echo "Файл \"$2\" не найден."

exit $E_NOFILE

fi

for word in $( strings "$2" | grep "$1" )

# Инструкция "strings" возвращает список строк в двоичных файлах.

# Который затем передается по конвейеру команде "grep", для выполнения поиска.

do

echo $word

done

# Как указывает S.C., вышепрведенное объявление цикла for может быть упрощено

# strings "$2" | grep "$1" | tr -s "$IFS" '[\n*]'

# Попробуйте что нибудь подобное: "./bin-grep.sh mem /bin/ls"

exit 0

Еще один пример.

Пример 10-8. Список всех пользователей системы

#!/bin/bash

# userlist.sh

PASSWORD_FILE=/etc/passwd

n=1 # Число пользователей

for name in $(awk 'BEGIN{FS=":"}{print $1}' < "$PASSWORD_FILE" )

Поделиться с друзьями: