KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Мендель Купер - Искусство программирования на языке сценариев командной оболочки

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Мендель Купер, "Искусство программирования на языке сценариев командной оболочки" бесплатно, без регистрации.
Перейти на страницу:

Пример 12-2. Badname, удаление файлов в текущем каталоге, имена которых содержат недопустимые символы и пробелы.

#!/bin/bash


# Удаление файлов в текущем каталоге, чьи имена содержат недопустимые символы.


for filename in *

do

badname=`echo "$filename" | sed -n /[+{;"\=?~()<>&*|$]/p`

# Недопустимые символы в именах файлов: + { ; " = ? ~ ( ) < > & * | $

rm $badname 2>/dev/null # Сообщения об ошибках "выстреливаются" в никуда.

done


# Теперь "позаботимся" о файлах, чьи имена содержат пробельные символы.

find . -name "* *" -exec rm -f {} ;

# На место "{}", find подставит полное имя файла.

# Символ '' указывает на то, что ';' интерпретируется как обычный символ, а не как конец команды.


exit 0


#---------------------------------------------------------------------

# Строки, приведенные ниже, не будут выполнены, т.к. выше стоит команда "exit".


# Альтернативный вариант сценария:

find . -name '*[+{;"\=?~()<>&*|$ ]*' -exec rm -f '{}' ;

exit 0

# (Спасибо S.C.)

Пример 12-3. Удаление файла по его номеру inode

#!/bin/bash

# idelete.sh: Удаление файла по номеру inode.


# Этот прием используется в тех случаях, когда имя файла начинается с недопустимого символа,

#+ например, ? или -.


ARGCOUNT=1 # Имя файла должно быть передано в сценарий.

E_WRONGARGS=70

E_FILE_NOT_EXIST=71

E_CHANGED_MIND=72


if [ $# -ne "$ARGCOUNT" ]

then

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

exit $E_WRONGARGS

fi


if [ ! -e "$1" ]

then

echo "Файл ""$1"" не найден."

exit $E_FILE_NOT_EXIST

fi


inum=`ls -i | grep "$1" | awk '{print $1}'`

# inum = номер inode (index node) файла

# Каждый файл имеет свой inode, где хранится информация о физическом расположении файла.


echo; echo -n "Вы совершенно уверены в том, что желаете удалить "$1" (y/n)? "

# Ключ '-v' в команде 'rm' тоже заставит команду вывести подобный запрос.

read answer

case "$answer" in

[nN]) echo "Передумали?"

exit $E_CHANGED_MIND

;;

*) echo "Удаление файла "$1".";;

esac


find . -inum $inum -exec rm {} ;

echo "Файл ""$1"" удален!"


exit 0

Дополнительные примеры по использованию команды find вы найдете в Пример 12-22, Пример 3-4 и Пример 10-9. В страницах справочного ркуоводства (man find) вы найдете более подробную информацию об этой достаточно сложной и мощной команде.

xargs

Команда передачи аргументов указанной команде. Она разбивает поток аргументов на отдельные составляющие и поочередно передает их заданной команде для обработки. Эта команда может рассматриваться как мощная замена обратным одиничным кавычкам. Зачастую, когда команды, заключенные в обратные одиночные кавычки, завершаются с ошибкой too many arguments (слишком много аргументов), использование xargs позволяет обойти это ограничение. Обычно, xargs считывает список аргументов со стандартного устройства ввода stdin или из канала (конвейера), но может считывать информацию и из файла.

Если команда не задана, то по-умолчанию выполняется echo. При передаче аргументов по конвейеру, xargs допускает наличие пробельных символов и символов перевода строки, которые затем автоматически отбрасываются.

bash$ ls -l

total 0

-rw-rw-r-- 1 bozo bozo 0 Jan 29 23:58 file1

-rw-rw-r-- 1 bozo bozo 0 Jan 29 23:58 file2


bash$ ls -l | xargs

total 0 -rw-rw-r-- 1 bozo bozo 0 Jan 29 23:58 file1 -rw-rw-r-- 1 bozo bozo 0 Jan 29 23:58 file2


ls | xargs -p -l gzip -- упакует с помощью gzip все файлы в текущем каталоге, выводя запрос на подтверждение для каждого файла.

xargs имеет очень любопытный ключ -n NN, который ограничивает количество передаваемых аргументов за один "присест" числом NN.

ls | xargs -n 8 echo -- выведет список файлов текущего каталога в 8 колонок.

Еще одна полезная опция -- -0, в комбинации с find -print0 или grep -lZ позволяет обрабатывать аргументы, содержащие пробелы и кавычки.

find / -type f -print0 | xargs -0 grep -liwZ GUI | xargs -0 rm -f

grep -rliwZ GUI / | xargs -0 rm -f

Обе вышеприведенные команды удалят все файлы, содержащие в своем имени комбинацию символов "GUI". (Спасибо S.C.)

Пример 12-4. Использование команды xargs для мониторинга системного журнала

#!/bin/bash


# Создание временного файла мониторинга в текщем каталоге,

# куда переписываются несколько последних строк из /var/log/messages.


# Обратите внимание: если сценарий запускается обычным пользователем,

# то файл /var/log/messages должен быть доступен на чтение этому пользователю.

# #root chmod 644 /var/log/messages


LINES=5


( date; uname -a ) >>logfile

# Время и информация о системе

echo --------------------------------------------------------------------- >>logfile

tail -$LINES /var/log/messages | xargs | fmt -s >>logfile

echo >>logfile

echo >>logfile


exit 0


# Упражнение:

# --------

# Измените сценарий таким образом, чтобы он мог отслеживать изменения в /var/log/messages

#+ с интервалом в 20 минут.

# Подсказка: воспользуйтесь командой "watch".

Пример 12-5. copydir, копирование файлов из текущего каталога в другое место, с помощью xargs

#!/bin/bash


# Копирует все файлы из текущего каталога

# в каталог, указанный в командной строке.


if [ -z "$1" ] # Выход, если каталог назначения не задан.

then

echo "Порядок использования: `basename $0` directory-to-copy-to"

exit 65

fi


ls . | xargs -i -t cp ./{} $1

# Этот сценария является точным эквивалентом

# cp * $1

# если в именах файлов не содержатся пробельные символы.


exit 0

expr

Универсальный обработчик выражений: вычисляет заданное выражение (аргументы должны отделяться пробелами). Выражения могут быть арифметическими, логическими или строковыми.

expr 3 + 5

возвратит 8

expr 5 % 3

возвратит 2

expr 5 * 3

возвратит 15

В арифметических выражениях, оператор умножения обязательно должен экранироваться обратным слэшем.

y=`expr $y + 1`

Операция инкремента переменной, то же самое, что и let y=y+1, или y=$(($y+1)). Пример подстановки арифметических выражений.

z=`expr substr $string $position $length`

Извлекает подстроку длиной $length символов, начиная с позиции $position.

Пример 12-6. Пример работы с expr

#!/bin/bash


# Демонстрация некоторых приемов работы с командой 'expr'

# =======================================


echo


# Арифметические операции

# -------------- --------


echo "Арифметические операции"

echo

a=`expr 5 + 3`

echo "5 + 3 = $a"


a=`expr $a + 1`

echo

echo "a + 1 = $a"

echo "(инкремент переменной)"


a=`expr 5 % 3`

# остаток от деления (деление по модулю)

echo

echo "5 mod 3 = $a"


echo

echo


# Логические операции

# ---------- --------


# Возвращает 1 если выражение истинноо, 0 -- если ложно,

#+ в противоположность соглашениям, принятым в Bash.


echo "Логические операции"

echo


x=24

y=25

b=`expr $x = $y` # Сравнение.

echo "b = $b" # 0 ( $x -ne $y )

echo


a=3

b=`expr $a > 10`

echo 'b=`expr $a > 10`, поэтому...'

echo "Если a > 10, то b = 0 (ложь)"

echo "b = $b" # 0 ( 3 ! -gt 10 )

echo


b=`expr $a < 10`

echo "Если a < 10, то b = 1 (истина)"

echo "b = $b" # 1 ( 3 -lt 10 )

echo

# Обратите внимание на необходимость экранирования операторов.


b=`expr $a <= 3`

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*