Мендель Купер - Искусство программирования на языке сценариев командной оболочки
- Название:Искусство программирования на языке сценариев командной оболочки
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Мендель Купер - Искусство программирования на языке сценариев командной оболочки краткое содержание
Данное руководство не предполагает наличие у читателя познаний в области программирования на языке сценариев, однако, быстро восполняет этот недостаток, постепенно, шаг за шагом раскрывая мудрость и красоту UNIX. Это руководство может рассматриваться как учебник, предназначенный для самостоятельного изучения или как справочник по программированию на shell. Руководство снабжено серией хорошо прокомментированных примеров, поскольку лучший путь к изучению языка сценариев -- это написание сценариев.
Искусство программирования на языке сценариев командной оболочки - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
echo
echo "$y" # Если имя переменной записать в кавычках -- символы перевода строки сохраняются.
echo; echo
y=`eval df` # Аналогично y=`df`
echo $y # но без символов перевода строки.
# Когда производится подавление вывода символов LF (перевод строки), то анализ
#+ результатов различными утилитами, такими как awk, можно сделать проще.
exit 0
Пример 11-10. Принудительное завершение сеанса
#!/bin/bash
y=`eval ps ax | sed -n '/ppp/p' | awk '{ print $1 }'`
# Выяснить PID процесса 'ppp'.
kill -9 $y # "Прихлопнуть" его
# Предыдущие строки можно заменить одной строкой
# kill -9 `ps ax | awk '/ppp/ { print $1 }'
chmod 666 /dev/ttyS3
# Завершенный, по сигналу SIGKILL, ppp изменяет права доступа
# к последовательному порту. Вернуть их в первоначальное состояние.
rm /var/lock/LCK..ttyS3 # Удалить lock-файл последовательного порта.
exit 0
Пример 11-11. Шифрование по алгоритму "rot13"
#!/bin/bash
# Реализация алгоритма шифрования "rot13" с помощью 'eval'.
# Сравните со сценарием "rot13.sh".
setvar_rot_13() # Криптование по алгоритму "rot13"
{
local varname=$1 varvalue=$2
eval $varname='$(echo "$varvalue" | tr a-z n-za-m)'
}
setvar_rot_13 var "foobar" # Пропустить слово "foobar" через rot13.
echo $var # sbbone
echo $var | tr a-z n-za-m # foobar
# Расшифровывание.
# Пример предоставил Stephane Chazelas.
exit 0
Rory Winston представил следующий пример, как образец практического использования команды eval.
Пример 11-12. Замена имени переменной на ее значение, в исходном тексте программы на языке Perl, с помощью eval
В программе "test.pl", на языке Perl:
...
my $WEBROOT = ;
...
Эта попытка подстановки значения переменной вместо ее имени:
$export WEBROOT_PATH=/usr/local/webroot
$sed 's//$WEBROOT_PATH/' < test.pl > out
даст такой результат:
my $WEBROOT = $WEBROOT_PATH;
Тем не менее:
$export WEBROOT_PATH=/usr/local/webroot
$eval sed 's//$WEBROOT_PATH/' < test.pl > out
# ====
Этот вариант дал желаемый результат -- имя переменной, в тексте программы,
благополучно было заменено на ее значение:
my $WEBROOT = /usr/local/webroot
Команда evalможет быть небезопасна. Если существует приемлемая альтернатива, то желательно воздерживаться от использования eval. Так, eval $COMMANDSисполняет код, который записан в переменную COMMANDS , которая, в свою очередь, может содержать весьма неприятные сюрпризы, например rm -rf *. Использование команды eval, для исполнения кода неизвестного происхождения, крайне опасно.
set
Команда setизменяет значения внутренних переменных сценария. Она может использоваться для переключения опций (ключей, флагов), определяющих поведение скрипта. Еще одно применение -- сброс/установка позиционных параметров (аргументов), значения которых будут восприняты как результат работы команды ( set `command`).
Пример 11-13. Установка значений аргументов с помощью команды set
#!/bin/bash
# script "set-test"
# Вызовите сценарий с тремя аргументами командной строки,
# например: "./set-test one two three".
echo
echo "Аргументы перед вызовом set \`uname -a\` :"
echo "Аргумент #1 = $1"
echo "Аргумент #2 = $2"
echo "Аргумент #3 = $3"
set `uname -a` # Изменение аргументов
# значения которых берутся из результата работы `uname -a`
echo $_
echo "Аргументы после вызова set \`uname -a\` :"
# $1, $2, $3 и т.д. будут переустановлены в соответствии с выводом
#+ команды `uname -a`
echo "Поле #1 'uname -a' = $1"
echo "Поле #2 'uname -a' = $2"
echo "Поле #3 'uname -a' = $3"
echo ---
echo $_ # ---
echo
exit 0
Вызов setбез параметров просто выводит список инициализированных переменных окружения.
bash$ set
AUTHORCOPY=/home/bozo/posts
BASH=/bin/bash
BASH_VERSION=$'2.05.8(1)-release'
...
XAUTHORITY=/home/bozo/.Xauthority
_=/etc/bashrc
variable22=abc
variable23=xzy
Если команда setиспользуется с ключом " -- ", после которого следует переменная, то значение переменной переносится в позиционные параметры (аргументы). Если имя переменной отсутствует, то эта команда приводит к сбросу позиционных параметров.
Пример 11-14. Изменение значений позиционных параметров (аргументов)
#!/bin/bash
variable="one two three four five"
set -- $variable
# Значения позиционных параметров берутся из "$variable".
first_param=$1
second_param=$2
shift; shift # сдвиг двух первых параметров.
remaining_params="$*"
echo
echo "первый параметр = $first_param" # one
echo "второй параметр = $second_param" # two
echo "остальные параметры = $remaining_params" # three four five
echo; echo
# Снова.
set -- $variable
first_param=$1
second_param=$2
echo "первый параметр = $first_param" # one
echo "второй параметр = $second_param" # two
# ======================================================
set --
# Позиционные параметры сбрасываются, если не задано имя переменной.
first_param=$1
second_param=$2
echo "первый параметр = $first_param" # (пустое значение)
echo "второй параметр = $second_param" # (пустое значение)
exit 0
См. так же Пример 10-2 и Пример 12-40.
unset
Команда unsetудаляет переменную, фактически -- устанавливает ее значение в null . Обратите внимание: эта команда не может сбрасывать позиционные параметры (аргументы).
bash$ unset PATH
bash$ echo $PATH
bash$
Пример 11-15. "Сброс" переменной
#!/bin/bash
# unset.sh: Сброс переменной.
variable=hello # Инициализация.
echo "variable = $variable"
unset variable # Сброс.
# Тот же эффект дает variable=
echo "(unset) variable = $variable" # $variable = null.
exit 0
export
Команда exportэкспортирует переменную, делая ее доступной дочерним процессам. К сожалению, невозможно экспортировать переменную родительскому процессу. В качестве примера использования команды exportможно привести сценарии инициализации системы, вызываемые в процессе загрузки, которые инициализируют и экспортируют переменные окружения, делая их доступными для пользовательских процессов.
Пример 11-16. Передача переменных во вложенный сценарий awk, с помощью export
#!/bin/bash
# Еще одна версия сценария "column totaler" (col-totaler.sh)
# который суммирует заданную колонку (чисел) в заданном файле.
# Здесь используются переменные окружения, которые передаются сценарию 'awk'.
ARGS=2
E_WRONGARGS=65
if [ $# -ne "$ARGS" ] # Проверка количества входных аргументов.
then
echo "Порядок использования: `basename $0` filename column-number"
Читать дальшеИнтервал:
Закладка: