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


Программирование на языке сценариев командной оболочки - стр. 235


/p>

Перенаправление

Перенаправление ввода для функций

Функции -- суть есть блок кода, а это означает, что устройство stdin для функций может быть переопределено (перенаправление stdin) (как в Пример 3-1).

Пример 22-7. Настоящее имя пользователя

#!/bin/bash

# По имени пользователя получить его "настоящее имя" из /etc/passwd.

ARGCOUNT=1 # Ожидается один аргумент. E_WRONGARGS=65

file=/etc/passwd pattern=$1

if [ $# -ne "$ARGCOUNT" ] then echo "Порядок использования: `basename $0` USERNAME" exit $E_WRONGARGS fi

file_excerpt () # Производит поиск в файле по заданному шаблону, выводит требуемую часть строки. { while read line do echo "$line" | grep $1 | awk -F":" '{ print $5 }' # Указывет awk использовать ":" как разделитель полей. done } <$file # Подменить stdin для функции.

file_excerpt $pattern

# Да, этот сценарий можно уменьшить до # grep PATTERN /etc/passwd | awk -F":" '{ print $5 }' # или # awk -F: '/PATTERN/ {print $5}' # или # awk -F: '($1 == "username") { print $5 }' # Однако, это было бы не так поучительно.

exit 0

Ниже приводится альтернативный, и возможно менее запутанный, способ перенаправления ввода для функций. Он заключается в использовании перенаправления ввода для блока кода, заключенного в фигурные скобки, в пределах функции.

# Вместо: Function () { ... } < file

# Попробуйте так: Function () { { ... } < file }

# Похожий вариант,

Function () # Тоже работает. { { echo $* } | tr a b }

Function () # Этот вариант не работает. { echo $* } | tr a b # Наличие вложенного блока кода -- обязательное условие.

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

22.2. Локальные переменные

Что такое "локальная" переменная?

локальные переменные

Переменные, объявленные как локальные, имеют ограниченную область видимости, и доступны только в пределах блока, в котором они были объявлены. Для функций это означает, что локальная переменная "видна" только в теле самой функции.




- Начало -  - Назад -  - Вперед -