繁体   English   中英

如何在bash脚本中定义和声明带有动态变量的函数名称

[英]How to define and declare a function name with dynamic variable in it in bash scripting

详细代码

#!/usr/bin/bash -xv

FUNCTION_DYNAMIC

eval "function APP_$i_$j
{
    `enter code here`
}"

DEFINING_FUNC_TO_CALCULATE_VALUE

APP_VAR_MKT()
{
    for i in `cat ${SERVER}`
    do
        for j in `cat ${ZONE}`
        do
            shopt -s expand_aliases
            alias name="APP_${i}_${j}"
            declare -fp "APP_${i}_${j}"
        done
    done
}

主要

SERVER_NAME=/path/servers_file
ZONE=/path/zones_file

包含变量的DECLARING FUNCTION

APP_VAR_MKT

你不 您将该信息作为参数传递:

app () {
    server_name=$1
    zone=$2
    # ...
}


app "$SERVER_NAME" "$ZONE"

免责声明:动态声明函数不是您应该使用的方法。 请参阅chepner的答案 ,这绝对是首选方法!

但是,如果您真的想动态创建名称,则可以使用另一种方法来创建名称,这比eval问题要少一些:

#!/usr/bin/env bash 

SERVER_NAME=foo
ZONE=bar

shopt -s expand_aliases
alias name="APP_${SERVER_NAME}_$ZONE"

name() { 
   echo hello
}

declare -fp "APP_${SERVER_NAME}_${ZONE}"

declare的输出显示APP_foo_bar已声明:

APP_foo_bar () 
{ 
    echo hello
}

现在,这在某种程度上可行 如果输入不受您的控制,则必须非常小心。 这可能具有潜在的危险:

#!/usr/bin/env bash 

SERVER_NAME='foo() { echo hi; }; echo ouch;'
ZONE=bar

shopt -s expand_aliases
alias name="APP_${SERVER_NAME}_$ZONE"

name() { 
   echo hello
}

declare -fp APP_foo
declare -fp _bar

当使用正确的 alias ,此方法可用于执行任意代码。 该脚本的输出为:

ouch
APP_foo () 
{ 
    echo hi
}
_bar () 
{ 
    echo hello
}

不仅声明了错误的函数,还执行了echo ouch 现在想象一下,如果我使用rm -rf * 使用eval出现完全相同的问题。


结论:不要这样做:)

除非您有充分的理由,否则不应该这样做-函数是可重用的代码封装,并且它们的名称不应正常更改。 另外,您不应该使用eval,因为它非常危险。 所以要当心。

如果绝对必须执行的操作是使用eval:

#!/bin/bash

eval "function APP_${SERVER_NAME}_${ZONE}
{
    echo 'XXX'
}"

APP_${SERVER_NAME}_${ZONE}

结果:

XXX

正如其他人所说,动态生成函数(或变量)名称不是一个好主意,相反,您可以在有时称为分派表的结构中使用关联数组。

这个想法是,关联数组的键(有时称为“哈希”,“哈希表”或字典)拥有函数的名称。 当您需要特定功能时,只需调用它即可。 这是一个简单的示例:

# Statically declare each function

func1() {
    echo "This is func1"
}

func2() {
    echo "This is func2"
}

# Declare the array as associative
declare -A lookup

# Setup the association of dynamic name with function
lookup[APP_fred_CBD]='func1'
lookup[APP_jim_ABCD]='func2'

SERVER_NAME='fred'
ZONE='CBD'
${lookup[APP_${SERVER_NAME}_${ZONE}]}

SERVER_NAME='jim'
ZONE='ABCD'
${lookup[APP_${SERVER_NAME}_${ZONE}]}

得到:

This is func1
This is func2

如果您的应用程序不需要唯一功能,则可以将同一功能用于多个键,并传递参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM