Администрирование FreeBSD, Linux, ... Примеры использования команды eval Sat, May 18 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Примеры использования команды eval Печать
Добавил(а) microsin   

Bash eval это встроенная команда шелла, используемая для вычисления и выполнения строк как команд. Команда eval принимает и обрабатывает аргументы как одну командную строку для шелла для запуска как команды Bash.

Команда eval полезна, когда выполняется команда, которая содержит специальный оператор, или зарезервированные ключевые слова, или в скриптах с переменными, имена которых известны в течение времени выполнения скрипта.

Синтаксис команды eval:

eval [arguments]

Здесь [arguments] это строки или переменные, которые содержат команду (команды), которые вы хотите выполнить. Команда eval объединяет аргументы в одну строку, обрабатывает её как команду шелла, и выполняет эту команду.

После выполнения объединенной командной строки eval вернет её результат (состояние выхода, exit status) как результат eval. Если не были указаны аргументы, или были только пустые аргументы, то eval выполнит возврат с exit status 0.

Важное замечание: будьте осторожны, когда используете eval вместе со строкой, полученной откуда-нибудь вне скрипта (от другого пользователя, через API, и т. п.), которая не может быть достойным образом проверена на безопасность. Если строка не была получена локально или программно, то она потенциально может содержать вредоносные инструкции, которые повредят вашу систему.

[Примеры команд с использованием eval]

Основное назначение eval - интерпретировать и выполнить динамические или сложные команды, сохраненные в строках или переменных. Это позволит вам динамически генерировать и запускать команды.

В последующих секциях раскрываются некоторые полезные примеры применения eval.

Сохранение команды в переменную. Это полезная возможность, особенно когда вы хотите сохранить её с опцией или флагом, добавленным к команде. В следующем примере мы сохраним команду ls с опцией -l в переменную с именем var.

Здесь команда eval возьмет значение переменной var как ls -l и выполнит её:

$ var="ls -l"
$ eval "$var"
total 36
drwxr-xr-x 2 microsin microsin 4096 May  3 03:16 Bookshelf
drwxr-xr-x 2 microsin microsin 4096 Sep 13 18:24 Desktop
drwxr-xr-x 2 microsin microsin 4096 Sep 13 18:24 Documents
drwxr-xr-x 2 microsin microsin 4096 Sep 13 18:24 Downloads
drwxr-xr-x 2 microsin microsin 4096 Sep 13 18:24 Music
drwxr-xr-x 2 microsin microsin 4096 Sep 13 18:24 Pictures
drwxr-xr-x 2 microsin microsin 4096 Sep 13 18:24 Public
drwxr-xr-x 2 microsin microsin 4096 Sep 13 18:24 Templates
drwxr-xr-x 2 microsin microsin 4096 Sep 13 18:24 Videos

Подмена команды. В следующем примере команда eval заменяет команду date, помещенную в переменную command. Команда eval оценит строку и выполнит результат:

$ command="echo \$(date)"
$ eval "$command"
Sat 16 Sep 2023 04:18:07 PM MSK

Преобразование ввода. Другой пример, в котором команда eval используется для конвертации значений полей в нижний регистр символов. Следующий скрипт использует команду tr, чтобы преобразовать значение указанных полей в строчные символы. Для теста выполните следующие шаги:

1. Откройте терминал и создайте новый скрипт Bash. Для этого используйте любой подходящий редактор текста.

$ nano convertinput.sh

2. Добавьте в файл следующий код:

#!/bin/bash
 
# Приглашение для пользователя ввести значения:
read -p "Введите значение 1: " value1
read -p "Введите значение 2: " value2
# Конвертация введенных символов в нижний регистр с помощью eval:
eval "value1=\$(tr '[:upper:]' '[:lower:]' <<< "$value1")"
eval "value2=\$(tr '[:upper:]' '[:lower:]' <<< "$value2")"
# Печать преобразованных значений:
echo "Value 1 (lowercase): $value1"
echo "Value 2 (lowercase): $value2"

Этот скрипт с помощью команд read предлагает пользователю ввести 2 значения. Команда tr '[:upper:]' '[:lower:]' в аргументе eval выполнит преобразование, и заменит все символы в верхнем регистре на эквивалентные символы в нижнем регистре. После преобразования результат будет выведен на экран.

$ chmod +x convertinput.sh
$ ./convertinput.sh
Введите значение 1: DEadBeeF
Введите значение 2: Андрей
Value 1 (lowercase): deadbeef
Value 2 (lowercase): Андрей

Обратите внимание, что с русскими символами команда tr не справилась =).

Циклы и динамические команды. Команда eval может генерировать и выполнять команды динамически, внутри тела цикла. В следующем примере eval вычисляет строку "echo 'Итерация цикла $i'" для каждой прокрутки цикла, и динамически меняет значение переменной $i.

Выполните следующие шаги:

1. Создайте новый скрипт, и вставьте в него следующий код:

#!/bin/bash
 
for i in {1..3}; do
  eval "echo 'Итерация цикла $i'"
done

2. Сохраните скрипт и запустите его:

$ nano evalloop.sh
$ chmod +x evalloop.sh
$ ./evalloop.sh
Итерация цикла 1
Итерация цикла 2
Итерация цикла 3

Каждая строка в этом выводе соответствует одной итерации цикла, в которой значение переменной i подменяется и выводится в stdout.

Анализ значений полей. Используйте команду eval для динамического вычисления и анализа значений полей. В следующем примере мы используем скрипт, который приглашает пользователя ввести значения, и анализирует их:

1. Создайте скрипт, и вставьте в него следующий код:

#!/bin/bash
 
# Приглашение пользователю ввести значения полей:
read -p "Введите поле 1: " field1
read -p "Введите поле 2: " field2
read -p "Введите поле 3: " field3
# Анализ значений полей с помощью операторов if:
if [ "$field1" = "Значение1" ]; then
  eval "echo 'У поля 1 значение Значение1'"
elif [ "$field1" = "Value2" ]; then
  eval "echo 'У поля 1 значение Value2'"
else
  eval "echo 'Поле 1 не равно ни Значение1, ни Value2'"
fi
if [ "$field2" -gt 10 ]; then
  eval "echo 'Поле 2 больше 10'"
else
  eval "echo 'Поле 2 меньше или равно 10'"
fi
if [[ "$field3" =~ ^[A-Za-z]+$ ]]; then
  eval "echo 'В поле 3 содержатся только буквы'"
else
  eval "echo 'В поле 3 есть символы, которые не являются буквами'"
fi

2. Сохраните и запустите скрипт.

После этого введите три значения для полей (field1, field2, field3), и скрипт будет использовать команду eval для вывода результатов из тела оператора if:

$ nano analyse.sh
$ chmod +x analyse.sh
$ ./analyse.sh
Введите поле 1: Значение1
Введите поле 2: 13
Введите поле 3: Привет
У поля 1 значение Значение1
Поле 2 больше 10
В поле 3 есть символы, которые не являются буквами

Доступ к переменной из переменной. Используйте команду eval для назначения значения переменной, и затем назначения имени этой переменной другой переменной. Через eval можно получить доступ к значению хранящемуся в первой переменной, используя имя во второй переменной.

Выполните следующие шаги:

1. Создайте новый скрипт, и вставьте в него следующий код:

#!/bin/bash
 
title="Привет"
name=title
command="echo"
eval $command \${$name}

2. Запустите скрипт для проверки его работы:

$ nano varaccess.sh
$ chmod +x varaccess.sh
$ ./varaccess.sh
Привет

Запущенный скрипт выведет текст из переменной title, даже если команда eval использует переменную name. Здесь eval смотрит на значение имени переменной, сохраненное в переменной name.

Сохранение конфигурации SSH в шелл. Используйте eval для оценки вывода программы ssh-agent и сохранения ключей и паролей SSH в шелл. Обычно, когда вы запускаете ssh-agent, она запускается в суб-шелле, и не может повлиять на родительское окружение шелла.

Примечание: см. руководство [2], чтобы узнать, как использовать аутентификацию публичным ключом в SSH.

Как следствие, полученная конфигурация окажется неизвестна для текущего сеанса терминала или любого нового созданного сеанса. Это означает, что при выходе из шелл или попытке инициирования нового соединения SSH всегда будет запрашивать ключ SSH и пароль.

Однако с помощью eval следующая команда добавит конфигурацию в текущее рабочее окружение шелл. Запустите следующую команду для проверки:

$ eval $(ssh-agent)
Agent pid 27937

Эта команда вычислит вывод ssh-agent, и автоматически использует учетные данные каждый раз, когда создается новое соединение, пока вы не выйдете из сеанса или пока не перезагрузите компьютер.

Примечание: в статье [3] описывается, как склеивать строки в Bash, чтобы создать более длинные строки, путем присоединения одной строки в конец другой.

[Ссылки]

1. Bash eval Command with Examples site:phoenixnap.com.
2. How to Use Public Key Authentication with SSH site:phoenixnap.com.
3. How to Concatenate Strings in Bash site:phoenixnap.com.

 

Добавить комментарий


Защитный код
Обновить

Top of Page