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

cat $filename | grep $search_word

В конвейер могут объединяться и сценарии на языке командной оболочки.

#!/bin/bash

# uppercase.sh : Преобразование вводимых символов в верхний регистр.

tr 'a-z' 'A-Z'

# Диапазоны символов должны быть заключены в кавычки

#+ чтобы предотвратить порождение имен файлов от однобуквенных имен файлов.

exit 0

А теперь попробуем объединить в конвейер команду ls -l с этим сценарием.

bash$ ls -l | ./uppercase.sh

-RW-RW-R-- 1 BOZO BOZO 109 APR 7 19:49 1.TXT

-RW-RW-R-- 1 BOZO BOZO 109 APR 14 16:48 2.TXT

-RW-R--R-- 1 BOZO BOZO 725 APR 20 20:56 DATA-FILE

Выход stdout каждого процесса в конвейере должен читаться на входе stdin последующим, в конвейере, процессом. Если этого не делается, то поток данных блокируется, в результате конвейер будет работать не так как ожидается.

cat file1 file2 | ls -l | sort

# Вывод команды "cat file1 file2" будет утерян.

Конвейер исполняется в дочернем процессе, а посему -- не имеет доступа к переменным сценария.

variable="initial_value"

echo "new_value" | read variable

echo "variable = $variable" # variable = initial_value

Если одна из команд в конвейере завершается аварийно, то это приводит к аварийному завершению работы всего конвейера.

>|

принудительное перенаправление, даже если установлен ключ noclobber option.

||

логическая операция OR (логическое ИЛИ). В опрециях проверки условий, оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА).

&

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

bash$ sleep 10 &

[1] 850

[1]+ Done sleep 10

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

Пример 3-3. Запуск цикла в фоновом режиме

#!/bin/bash

# background-loop.sh

for i in 1 2 3 4 5 6 7 8 9 10 # Первый цикл.

do

echo -n "$i "

done & # Запуск цикла в фоне.

# Иногда возможны случаи выполнения этого цикла после второго цикла.

echo # Этот 'echo' иногда не отображается на экране.

for i in 11 12 13 14 15 16 17 18 19 20 # Второй цикл.

do

echo -n "$i "

done

echo # Этот 'echo' иногда не отображается на экране.

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

# Ожидается, что данный сценарий выведет следующую последовательность:

# 1 2 3 4 5 6 7 8 9 10

# 11 12 13 14 15 16 17 18 19 20

# Иногда возможен такой вариант:

# 11 12 13 14 15 16 17 18 19 20

# 1 2 3 4 5 6 7 8 9 10 bozo $

# (Второй 'echo' не был выполнен. Почему?)

# Изредка возможен такой вариант:

# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

# (Первый 'echo' не был выполнен. Почему?)

# Крайне редко встречается и такое:

# 11 12 13 1 2 3 4 5 6 7 8 9 10 14 15 16 17 18 19 20

# Второй цикл начал исполняться раньше первого.

exit 0

Команда, исполняемая в пределах сценария в фоне, может подвесить сценарий, ожидая нажатия клавиши. К счастью, это легко "лечится".

&&

Логическая операция AND (логическое И). В операциях проверки условий, оператор && возвращает 0 (success) тогда, и только тогда, когда оба операнда имеют значение true (ИСТИНА).

-

префикс ключа. С этого символа начинаются опциональные ключи команд.

COMMAND -[Option1][Option2][...]

ls -al

sort -dfu $filename

set -- $variable

if [ $file1 -ot $file2 ]

then

echo "Файл $file1 был создан раньше чем $file2."

fi

if [ "$a" -eq "$b" ]

then

echo "$a равно $b."

fi

if [ "$c" -eq 24 -a "$d" -eq 47 ]

then

echo "$c равно 24, а $d равно 47."

fi

-

перенаправление из/в stdin или stdout. [дефис]

(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)

# Перемещение полного дерева файлов и подкаталогов из одной директории в другую

# [спасибо Алану Коксу (Alan Cox) <a.cox@swansea.ac.uk>, за небольшие поправки]

# 1) cd /source/directory Переход в исходный каталог, содержимое которого будет перемещено