Искусство программирования на языке сценариев командной оболочки
Шрифт:
# Даже не пробуйте раскомментарить эту строку! Это приведет к зависанию сценария.
# Автор этого документа не знает, где можно было бы использовать
#+ запись содержимого двоичных файлов в переменные.
exit 0
Обратите внимание: в данной ситуации не возникает ошибки переполнения буфера. Этот пример показывает превосходство защищенности интерпретирующих языков, таких как Bash, от ошибок программиста, над компилирующими языками программирования.
Подстановка команд, позволяет записать в переменную результаты
Пример 14-2. Запись результатов выполнения цикла в переменную
#!/bin/bash
# csubloop.sh: Запись результатов выполнения цикла в переменную
variable1=`for i in 1 2 3 4 5
do
echo -n "$i" # Здесь 'echo' -- это ключевой момент
done`
echo "variable1 = $variable1" # variable1 = 12345
i=0
variable2=`while [ "$i" -lt 10 ]
do
echo -n "$i" # Опять же, команда 'echo' просто необходима.
let "i += 1" # Увеличение на 1.
done`
echo "variable2 = $variable2" # variable2 = 0123456789
exit 0
Подстановка команд позволяет существенно расширить набор инструментальных средств, которыми располагает Bash. Суть состоит в том, чтобы написать программу или сценарий, которая выводит результаты своей работы на stdout (как это делает подавляющее большинство утилит в UNIX) и записать вывод от программы в переменную.
#include <stdio.h>
/* Программа на C "Hello, world." */
int main
{
printf( "Hello, world." );
return (0);
}
bash$ gcc -o hello hello.c
#!/bin/bash
# hello.sh
greeting=`./hello`
echo $greeting
bash$ sh hello.sh
Hello, world.
output=$(sed -n /"$1"/p $file) # К примеру из "grp.sh".
# Запись в переменную содержимого текстового файла.
File_contents1=$(cat $file1)
File_contents2=$(<$file2) # Bash допускает и такую запись.
Примеры подстановки команд в сценариях:
1. Пример 10-7
2. Пример 10-26
3. Пример 9-26
4. Пример 12-2
5. Пример 12-15
6. Пример 12-12
7. Пример 12-39
8. Пример 10-13
9. Пример 10-10
10. Пример 12-24
11. Пример 16-7
12. Пример A-19
13. Пример 27-1
14. Пример 12-32
15. Пример 12-33
16. Пример 12-34
Глава 15. Арифметические подстановки
Арифметические подстановки -- это мощный инструмент,
Вариации
Арифметические подстановки в обратных одиночных кавычках (часто используются совместно с командой expr)
z=`expr $z + 3` # Команда 'expr' вычисляет значение выражения.
Арифметические подстановки в двойных круглых скобках, и предложение let
В арифметических подстановках, обратные одиночные кавычки могут быть заменены на двойные круглые скобки $((...)) или очень удобной конструкцией, с применением предложения let.
z=$(($z+3))
# $((EXPRESSION)) -- это подстановка арифметического выражения. # Не путайте с
#+ подстановкой команд.
let z=z+3
let "z += 3" # Кавычки позволяют вставляьб пробелы и специальные операторы.
# Оператор 'let' вычисляет арифметическое выражение,
#+ это не подстановка арифметического выражения.
Все вышеприведенные примеры эквивалентны. Вы можете использовать любую из этих форм записи "по своему вкусу".
Примеры арифметических подстановок в сценариях:
1. Пример 12-6
2. Пример 10-14
3. Пример 25-1
4. Пример 25-6
5. Пример A-19
Глава 16. Перенаправление ввода/вывода
В системе по-умолчанию всегда открыты три "файла" -- stdin (клавиатура), stdout (экран) и stderr (вывод сообщений об ошибках на экран). Эти, и любые другие открытые файлы, могут быть перенапрвлены. В данном случае, термин "перенаправление" означает получить вывод из файла, команды, программы, сценария или даже отдельного блока в сценарии (см. Пример 3-1 и Пример 3-2) и передать его на вход в другой файл, команду, программу или сценарий.
С каждым открытым файлом связан дескриптор файла [ 44 ] . Дескрипторы файлов stdin, stdout и stderr -- 0, 1 и 2, соответственно. При открытии дополнительных файлов, дескрипторы с 3 по 9 остаются незанятыми. Иногда дополнительные дескрипторы могут сослужить неплохую службу, временно сохраняя в себе ссылку на stdin, stdout или stderr [ 45 ] . Это упрощает возврат дескрипторов в нормальное состояние после сложных манипуляций с перенаправлением и перестановками (см. Пример 16-1).
44
дескриптор файла -- это просто число, по которому система идентифицирует открытые файлы. Рассматривайте его как упрощенную версию указателя на файл.
45
При использрвании дескриптора с номером 5 могут возникать проблемы. Когда Bash порождает дочерний процесс, например командой exec, то дочерний процесс наследует дескриптор 5 как "открытый" (см. архив почты Чета Рамея (Chet Ramey), SUBJECT: RE: File descriptor 5 is held open) Поэтому, лучше не использовать этот дескриптор.