Bash 如何使用eval创建函数

Bash 如何使用eval创建函数,bash,function,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

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

    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
    }
这似乎有效:

fntext=$(cat <<EOF
function myfunc () {
echo hello world
}
EOF
)
尽管给出了示例,但您可以将所有输出转储到一个临时文件中,然后使用
操作符将其源代码导入:

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
}

您可以使用函数的文本构建字符串,然后
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"
}

另一种机制是使用
func=$(…echos…
捕获各种
echo
命令的输出,然后使用
eval
该字符串。构建字符串的诀窍是确保分号位于所有正确的位置-使用
echo
命令可能更容易,但您必须记住引用传递给
eval
的值以保留内部换行符。

我必须问:为什么要这样做?Bash已经很难正确编写了;这只会让事情变得更糟。
eval
e
和你的
val
生命!!!!!请您在答案的评论中注明正确答案或告知我们答案是否有效
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"
}