调用其名称存储在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
循环
您的目标是为开关功能提供:
#!/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
的值相同。如果我还想用一个参数(也是一个变量)调用函数呢?@MrCalvineval“$cmd\u with\u args”
我对所提供的“混合函数和变量”的理解是,可以动态构造函数/参数调用,但应该这样将它们分开:$the_命令“${args[@]}”
(其中args
是一个数组)避免奇怪的分词问题。如此清晰的用例和如此努力-+1。到目前为止没有其他投票。奇怪。@Binarus好吧,这是我在飞行中做的。把它清理干净!现在应该可以投票了。:-)
local-a animalFiles=(Dog Cat Bird Fish Frog Truck)
processAnimalFiles "/opt/someapp/data/" "${animalFiles[@]}"