如何使用eval创建函数

时间:2011-11-24 00:57:44

标签: bash function

我不知道如何解释一个问题...但这就是我的意思

    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 个答案:

答案 0 :(得分:4)

这似乎有效:

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
}

答案 1 :(得分:2)

您可以使用函数的文本构建一个字符串,然后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的值保留内部换行符。