如何在bash脚本中定义和声明包含动态变量的函数名 详细代码 动态函数 定义函数以计算值 主要 声明包含变量的函数

如何在bash脚本中定义和声明包含动态变量的函数名 详细代码 动态函数 定义函数以计算值 主要 声明包含变量的函数,bash,Bash,除非有充分的理由,否则不应该这样做——函数是代码的可重用封装,它们的名称通常不应该更改。此外,您不应该使用eval,因为它非常危险。因此,请注意 如果您必须使用eval,您可以做的是: #!/bin/bash eval "function APP_${SERVER_NAME}_${ZONE} { echo 'XXX' }" APP_${SERVER_NAME}_${ZONE} 结果是: XXX除非有充分的理由,否则您不应该这样做-函数是代码的可重用封装,它们的名称不应该正常更改。此

除非有充分的理由,否则不应该这样做——函数是代码的可重用封装,它们的名称通常不应该更改。此外,您不应该使用eval,因为它非常危险。因此,请注意

如果您必须使用eval,您可以做的是:

#!/bin/bash

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

APP_${SERVER_NAME}_${ZONE}
结果是:


XXX

除非有充分的理由,否则您不应该这样做-函数是代码的可重用封装,它们的名称不应该正常更改。此外,您不应该使用eval,因为它非常危险。因此,请注意

如果您必须使用eval,您可以做的是:

#!/bin/bash

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

APP_${SERVER_NAME}_${ZONE}
结果是:


XXX
你没有;您可以将该信息作为参数传递:

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


app "$SERVER_NAME" "$ZONE"

你没有;您可以将该信息作为参数传递:

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


app "$SERVER_NAME" "$ZONE"

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

其思想是关联数组(有时称为“哈希”、“哈希表”或字典)的键包含函数名。当您需要一个特定的函数时,只需调用它。下面是一个简单的例子:

# 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

如果您的应用程序不需要唯一的函数,您可以对多个键使用相同的函数,并传递参数。

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

其思想是关联数组(有时称为“哈希”、“哈希表”或字典)的键包含函数名。当您需要一个特定的函数时,只需调用它。下面是一个简单的例子:

# 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

如果应用程序不需要唯一的函数,则可以对多个键使用相同的函数,并传递参数。

免责声明:动态声明函数不是您应该使用的方法。看,这绝对是首选的方式

但是,如果您真的想动态创建名称,这里有另一种方法,这比
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\u foo\u 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
当使用正确的
别名
时,此方法可用于执行任意代码。此脚本的输出为:

ouch
APP_foo () 
{ 
    echo hi
}
_bar () 
{ 
    echo hello
}
不仅声明了错误的函数,
echo-ouch
被执行了!现在想象一下,如果我使用
rm-rf*
。使用
eval
会出现完全相同的问题



结论:不要这样做:)

免责声明:动态声明函数不是您应该使用的方法。看,这绝对是首选的方式

但是,如果您真的想动态创建名称,这里有另一种方法,这比
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\u foo\u 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
当使用正确的
别名
时,此方法可用于执行任意代码。此脚本的输出为:

ouch
APP_foo () 
{ 
    echo hi
}
_bar () 
{ 
    echo hello
}
不仅声明了错误的函数,
echo-ouch
被执行了!现在想象一下,如果我使用
rm-rf*
。使用
eval
会出现完全相同的问题



结论:不要这样做:)

我甚至不建议这样做,但要提出警告;您需要了解通常不需要在函数体中引用的所有内容,因为它将作为
eval
的参数进行扩展;您需要了解通常不需要在函数体中引用的所有内容,因为它将作为
eval
的参数进行扩展。您能否显示一个“”和“”的示例,以及它们之间的关系?您好,谢谢您的更新。在一个循环中,我试图声明并调用一个具有动态值的函数,是否可以在bash eval“函数APP_$i_$j{echo“something}”APP_VAR_ZONE{for i in
cat${FBF_SERVER}
;do for j in
cat${TLG_MARKET}
;do FBF{i}{j};done;done}如果可能的话,要避免使用SERVER\u NAME=/path/file\u NAME\u servers;ZONE=/path/file\u NAME\u zones;APP\u VAR\u ZONE
eval
,通常有更好的方法。为什么您需要一个具有动态名称的函数,为什么您不能只传递参数?顺便说一句,使用
cat
读取循环i中的文件这是一种非常糟糕的技术,不知道你想在代码中做什么,你能正确地格式化它并把它放在你的问题中吗?你好,我已经更新了我的代码细节,我正在尝试,但它失败了,因为没有逻辑来定义变量函数以及如何在每次迭代I和j之后转到该函数。此外,服务器文件具有5个不同服务器的名称,区域文件具有5个不同参数的名称,因此该函数应与1台服务器相同,首先处理所有5个区域参数,然后处理第2个serevr和所有5个区域参数,依此类推。为什么要将别名与函数混合使用?为什么不传递服务器名称和区域名称作为参数?为什么使用