# к последовательному порту. Вернуть их в первоначальное состояние.
rm /var/lock/LCK..ttyS3 # Удалить lock-файл последовательного порта.
Пример 11-11. Шифрование по алгоритму "rot13"
# Реализация алгоритма шифрования "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 | tr a-z n-za-m # foobar
# Пример предоставил Stephane Chazelas.
Rory Winston представил следующий пример, как образец практического использования команды eval.
Пример 11-12. Замена имени переменной на ее значение, в исходном тексте программы на языке Perl, с помощью eval
В программе "test.pl", на языке Perl:
Эта попытка подстановки значения переменной вместо ее имени:
$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 `command`).
Пример 11-13. Установка значений аргументов с помощью команды set
# Вызовите сценарий с тремя аргументами командной строки,
# например: "./set-test one two three".
echo "Аргументы перед вызовом set \`uname -a\` :"
set `uname -a` # Изменение аргументов
# значения которых берутся из результата работы `uname -a`
echo "Аргументы после вызова set \`uname -a\` :"
# $1, $2, $3 и т.д. будут переустановлены в соответствии с выводом
echo "Поле #1 'uname -a' = $1"
echo "Поле #2 'uname -a' = $2"
echo "Поле #3 'uname -a' = $3"
Вызов set без параметров просто выводит список инициализированных переменных окружения.
AUTHORCOPY=/home/bozo/posts
BASH_VERSION=$'2.05.8(1)-release'