web-dev-qa-db-fra.com

Appeler une fonction dont le nom est stocké dans une variable dans bash

Disons que j'ai:

function x {
    echo "x"
}
call_func="x"

Maintenant, je peux simplement utiliser eval comme suit:

eval $call_func

mais je me demandais s'il y avait une autre façon d'invoquer la fonction (si elle existe) dont le nom est stocké dans la variable: call_func.

20
hjpotter92

Vous devriez être en mesure d'appeler directement la fonction en utilisant

$call_func

Pour tout le reste, consultez cette réponse: https://stackoverflow.com/a/17529221/3236102 Ce n'est pas directement ce dont vous avez besoin, mais cela montre beaucoup de façons différentes d'appeler des commandes/fonctions .

Laisser l'utilisateur exécuter n'importe quel code arbitraire est cependant une mauvaise pratique, car cela peut être assez dangereux. Ce qui serait mieux, c'est de le faire comme ceci:

if [ $userinput == "command" ];then
    command
fi

De cette façon, l'utilisateur ne peut exécuter les commandes que vous le souhaitez et peut même générer un message d'erreur si l'entrée est incorrecte.

20
Dakkaron

Veuillez prendre note de:

Les variables contiennent des données, les fonctions contiennent du code.

C'est mauvaise pratique de les mélanger , n'essayez pas de le faire.


Oui, utilisez simplement un var. Si la var a a été définie par a=ls, puis:

$ $a

exécutera ls. Le premier $ est la ligne d'invite du shell.

4
user2350426

Cas d'utilisation du traitement de fichiers: émuler en passant des fonctions anonymes

Si vous avez 100 fichiers de cinq types différents et que vous souhaitez qu'une fonction différente traite chaque type de fichier, vous pouvez créer une fonction de commutation qui contient une boucle for avec une instruction case intégrée.

Votre objectif serait de fournir à la fonction de commutation:

1) Le nom de la fonction de traitement de fichiers. (1 $)

2) Une liste de noms de fichiers en appelant la fonction de collecte de fichiers appropriée.

Par conséquent, au lieu d'écrire une fonction distincte pour parcourir chaque type de fichier, vous n'utilisez qu'une seule fonction pour cela.

#!/usr/bin/ksh

##################################################################
#        Functions that gather specific kinds of filenames       #
##################################################################

function getDogFiles
{
    $targetDir=$1
    $fileGlobPattern="*.dog"

    ls ${targetDir}${filePattern}
}

function getCatFiles
{
    $targetDir=$1
    $fileGlobPattern="*.cat"

    ls ${targetDir}${filePattern}
}

function getBirdFiles
{
    $targetDir=$1
    $fileGlobPattern="*.bird"

    ls ${targetDir}${filePattern}
}

function getFishFiles
{
    $targetDir=$1
    $fileGlobPattern="*.fish"

    ls ${targetDir}${filePattern}
}

function getFrogFiles
{
    $targetDir=$1
    $fileGlobPattern="*.frog"

    ls ${targetDir}${filePattern}
}

##################################################################
#            Functions that process each type of file.           #
##################################################################

function processDogFiles
{
    filename=$1
    cat $filename
}

function processCatFiles
{
    filename=$1
    cat $filename
}

function processBirdFiles
{
    filename=$1
    cat $filename
}

function processFishFiles
{
    filename=$1
    cat $filename
}

function processFrogFiles
{
    filename=$1
    cat $filename
}

##################################################################
#            Functions to process all of the files               #
##################################################################

function processFiles
{
    fileProcessingFunction=$1
    shift 1

    for filename in "$@"
    do
        $fileProcessingFunction $filename
    done
}

function processAnimalFiles
{
    set -A animals Dog Cat Bird Fish Frog  # You could pass this into the function, too.

    processingPrefix="process"
    processingSuffix="Files"

    gatheringPrefix="get"
    gatheringSuffix="Files"

    for animal in "${animals[@]}"
    do
        case "$animal" in
        Dog | Cat | Bird | Fish | Frog)
            fileProcessingFunction="${processingPrefix}${animal}${processingSuffix}"
            fileGatheringFunction="${gatheringPrefix}${animal}${gatheringSuffix}"
            processFiles "$fileProcessingFunction" $fileGatheringFunction
            ;;
        *)
            echo "Unknown Species: ${animal} detected." >> /var/log/animalFiles.err.log
            ;;
    done
}
0
Anthony Rutledge