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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 27 28 29 30 31 32 33 34 35 ... 96

popd

echo "Возврат в первоначальный рабочий каталог `pwd`."

exit 0

Переменные

let

Команда let производит арифметические операции над переменными. В большинстве случаев, ее можно считать упрощенным вариантом команды expr.

Пример 11-8. Команда let, арифметические операции.

#!/bin/bash

echo

let a=11 # То же, что и 'a=11'

let a=a+5 # Эквивалентно "a = a + 5"

# (Двойные кавычки и дополнительные пробелы делают код более удобочитаемым)

echo "11 + 5 = $a"

let "a <<= 3" # Эквивалентно let "a = a << 3"

echo ""$a" (=16) после сдвига влево на 3 разряда = $a"

let "a /= 4" # Эквивалентно let "a = a / 4"

echo "128 / 4 = $a"

let "a -= 5" # Эквивалентно let "a = a - 5"

echo "32 - 5 = $a"

let "a = a * 10" # Эквивалентно let "a = a * 10"

echo "27 * 10 = $a"

let "a %= 8" # Эквивалентно let "a = a % 8"

echo "270 mod 8 = $a (270 / 8 = 33, остаток = $a)"

echo

exit 0

eval

eval arg1 [arg2] ... [argN]

Транслирует список аргументов, из списка, в команды.

Пример 11-9. Демонстрация команды eval

#!/bin/bash

y=`eval ls -l` # Подобно y=`ls -l`

echo $y # но символы перевода строки не выводятся, поскольку имя переменной не в кавычках.

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 = <WEBROOT_PATH>;

...

Эта попытка подстановки значения переменной вместо ее имени:

$export WEBROOT_PATH=/usr/local/webroot

$sed 's/<WEBROOT_PATH>/$WEBROOT_PATH/' < test.pl > out

даст такой результат:

my $WEBROOT = $WEBROOT_PATH;

Тем не менее:

$export WEBROOT_PATH=/usr/local/webroot

$eval sed 's/<WEBROOT_PATH>/$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 можно привести сценарии инициализации системы, вызываемые в процессе загрузки, которые инициализируют и экспортируют переменные окружения, делая их доступными для пользовательских процессов.

1 ... 27 28 29 30 31 32 33 34 35 ... 96
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Искусство программирования на языке сценариев командной оболочки - Мендель Купер.
Книги, аналогичгные Искусство программирования на языке сценариев командной оболочки - Мендель Купер

Оставить комментарий