Выбрать главу

Еще одна полезная опция -- -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`

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

echo "b = $b" # 1 ( 3 -le 3 )

# Существует еще оператор "\>=" (больше или равно).