Как создать функцию с помощью eval - PullRequest
3 голосов
/ 24 ноября 2011

я не знаю, как объяснить вопрос ... но вот что я имею в виду

    function make_dynamic_functions
    {
            echo "function fast_multiregex_check"
            echo "{"
            for i in 123410[0-9]* 123430[0-9]* 1235[89][0-9]{0,5} 1237[89][0-9]{8,} 1235551[0-9]*
            do
                    echo "if [[ \$1 =~ ^$i\$ ]]; then"
                    echo "echo $i"
                    echo "exit"
                    echo "fi"
            done
            echo "}"

        eval all-output-from-previous-echos
    }

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

Кажется, что это работает:

fntext=$(cat <<EOF
function myfunc () {
echo hello world
}
EOF
)

И затем:

$ eval "$fntext"
$ myfunc
hello world

Хотя, учитывая ваш пример, вы можете просто вывести все свои выходные данные во временный файл и затем поместить его вс оператором .:

function make_dynamic_functions
{
        (
        echo "function fast_multiregex_check"
        echo "{"
        for i in 123410[0-9]* 123430[0-9]* 1235[89][0-9]{0,5} 1237[89][0-9]{8,} 1235551[0-9]*
        do
                echo "if [[ \$1 =~ ^$i\$ ]]; then"
                echo "echo $i"
                echo "exit"
                echo "fi"
        done
        echo "}"
        ) > tmpfile
        . tmpfile
}
2 голосов
/ 24 ноября 2011

Вы можете построить строку с текстом функции, затем eval строку:

function make_dynamic_functions
{
    func="function fast_multiregex_check"
    func="$func {"
    for i in 123410[0-9]* 123430[0-9]* 1235[89][0-9]{0,5} 1237[89][0-9]{8,} 1235551[0-9]*
    do
            func="$func; if [[ \$1 =~ ^$i\$ ]]; then"
            func="$func echo $i;"
            func="$func exit;"
            func="$func fi;"
    done
    func="$func }"
    eval "$func"
}

Альтернативный механизм - захватить вывод различных команд echo с помощью func=$( ...echos... )а затем eval эта строка.Хитрость при построении строки состоит в том, чтобы убедиться, что точки с запятой находятся во всех нужных местах - это, вероятно, проще с командами echo, но вы должны не забывать заключать в кавычки значение, переданное в eval, чтобы сохранить внутренние*. переводы строк 1010 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...