调用其名称存储在bash变量中的函数

调用其名称存储在bash变量中的函数,bash,shell,scripting,Bash,Shell,Scripting,假设我有: function x { echo "x" } call_func="x" 现在,我可以简单地使用eval,如下所示: eval $call_func 但是我想知道是否有其他方法调用名称存储在变量中的函数(如果存在):call\u func您应该可以直接使用 $call_func 关于其他问题,请查看以下答案: 这并不是您直接需要的,但它展示了许多不同的方法来调用命令/函数 但是,让用户执行任意代码是不好的做法,因为这可能非常危险。最好是这样做: if [ $useri

假设我有:

function x {
    echo "x"
}
call_func="x"
现在,我可以简单地使用
eval
,如下所示:

eval $call_func

但是我想知道是否有其他方法调用名称存储在变量中的函数(如果存在):
call\u func

您应该可以直接使用

$call_func
关于其他问题,请查看以下答案: 这并不是您直接需要的,但它展示了许多不同的方法来调用命令/函数

但是,让用户执行任意代码是不好的做法,因为这可能非常危险。最好是这样做:

if [ $userinput == "command" ];then
    command
fi
这样,用户只能执行您希望他们执行的命令,如果输入不正确,甚至可以输出错误消息。

请注意:

变量保存数据,函数保存代码

是的,不要试着去做


是的,只需使用变量。如果变量a由
a=ls
设置,则:

$ $a
将执行
ls
。第一个$是shell的行提示符。

文件处理用例:模拟传递匿名函数 如果您有五种不同类型的100个文件,并且希望使用不同的函数来处理每种类型的文件,则可以创建一个切换函数,该函数包含一个带有嵌入式
case
语句的
for
循环

您的目标是为开关功能提供:

  • 文件处理函数的名称。(1美元)

  • 通过调用适当的文件收集函数来创建文件名列表

  • 因此,不用编写单独的函数来循环遍历每种文件,只需使用一个函数即可

    #!/bin/sh
    
    ##################################################################
    #        Functions that gather specific kinds of filenames       #
    ##################################################################
    
    function getDogFiles
    {
        local -r TARGET_DIR="$1"
        local fileGlobPattern="*.dog"
    
        ls ${TARGET_DIR}${fileGlobPattern}
    }
    
    function getCatFiles
    {
        local -r TARGET_DIR="$1"
        local fileGlobPattern="*.cat"
    
        ls ${TARGET_DIR}${fileGlobPattern}
    }
    
    function getBirdFiles
    {
        local -r TARGET_DIR="$1"
        local fileGlobPattern="*.bird"
    
        ls ${TARGET_DIR}${fileGlobPattern}
    }
    
    function getFishFiles
    {
        local -r TARGET_DIR="$1"
        local fileGlobPattern="*.fish"
    
        ls ${TARGET_DIR}${fileGlobPattern}
    }
    
    function getFrogFiles
    {
        local -r TARGET_DIR="$1"
        local fileGlobPattern="*.frog"
    
        ls ${TARGET_DIR}${fileGlobPattern}
    }
    
    ##################################################################
    #            Functions that process each type of file.           #
    ##################################################################
    
    function processDogFiles
    {
        local -r FILE_NAME="$1"
        cat $FILE_NAME
    }
    
    function processCatFiles
    {
        local -r FILE_NAME="$1"
        cat $FILE_NAME
    }
    
    function processBirdFiles
    {
        local -r FILE_NAME="$1"
        cat $FILE_NAME
    }
    
    function processFishFiles
    {
        local -r FILE_NAME="$1"
        cat $FILE_NAME
    }
    
    function processFrogFiles
    {
        local -r FILE_NAME="$1"
        cat $FILE_NAME
    }
    
    ##################################################################
    #            Functions to process all of the files               #
    ##################################################################
    
    function processItems
    {
        local -r PROCESSING_FUNCTION=$1
        shift 1
        
        for item in "$@"
        do
            $PROCESSING_FUNCTION "$item"
        done
    }
    
    function processAnimalFiles
    {
        local -r TARGET_DIR="$1"
    
        shift 1  # Remove the target directory from the argument list.
    
        local -ar FILE_TYPES=( "$@" )
    
        processingPrefix="process"
        processingSuffix="Files"
    
        gatheringPrefix="get"
        gatheringSuffix="Files"
    
        for fileType in "${FILE_TYPES[@]}"
        do
            case "$fileType" in
                Dog | Cat | Bird | Fish | Frog)
                    fileProcessingFunction="${processingPrefix}${fileType}${processingSuffix}"
                    fileGatheringFunction="${gatheringPrefix}${fileType}${gatheringSuffix}"
                    processItems "$fileProcessingFunction" $($fileGatheringFunction "$TARGET_DIR")   #    The second argument expands to a list of file names. 
                    ;;
                *)
                    echo "Unknown file type: ${fileType} file." >> /var/log/animalFiles.err.log
                    ;;
            esac
        done
    }
    
    #############################################################################


    call_func
    中的变量将是一个字符串(取自用户输入)。只需放入
    $call\u func
    即可回显其内容,而不执行函数。这不应该发生。你说你在用bash?如果将以下内容设置为:
    echo$($call\u func)
    ,会发生什么?另外,也许可以尝试以不同的方式解决这个问题。让用户执行任意代码是危险的!啊,nvm。这是因为函数名和里面的echo是一样的我现在觉得很傻,不用担心!我添加了更多关于如何更好地处理这种情况的信息。大约有20个可接受的函数名。目前,我正在搜索是否在字符串(包含所有允许的名称)中找到用户输入,然后搜索
    eval
    它(或者现在直接调用它)。不过我想找个更干净的工作环境。是的。这种方法有效。我感到困惑,因为
    x
    中的
    echo
    call\u func
    的值相同。如果我还想用一个参数(也是一个变量)调用函数呢?@MrCalvin
    eval“$cmd\u with\u args”
    我对所提供的“混合函数和变量”的理解是,可以动态构造函数/参数调用,但应该这样将它们分开:
    $the_命令“${args[@]}”
    (其中
    args
    是一个数组)避免奇怪的分词问题。如此清晰的用例和如此努力-+1。到目前为止没有其他投票。奇怪。@Binarus好吧,这是我在飞行中做的。把它清理干净!现在应该可以投票了。:-)
    local-a animalFiles=(Dog Cat Bird Fish Frog Truck)
    processAnimalFiles "/opt/someapp/data/" "${animalFiles[@]}"