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
.
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.
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.
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
}