如何使用变量来定义函数名称?



我需要在我的bash配置文件中定义一个函数列表。它们都遵循相同的模式。我尝试使用变量作为函数名

for f in a b c
do 
function $f {
. mydir/$f;
}
done

我从linux和windows bash中得到以下错误:

-bash: `$f': not a valid identifier
-bash: `$f': not a valid identifier
-bash: `$f': not a valid identifier

还有别的方法吗?

您可以使用eval,但我不喜欢使用eval作为一般规则。要正确使用引号和转义是非常棘手的,这意味着很容易做不安全的事情。使用eval的脚本非常容易受到输入注入攻击,攻击者会在文件系统上输入错误的输入或放置奇怪的命名文件,并欺骗脚本运行任意命令。

我会写出所有的函数声明,用一个查找调用者名称的灵巧的辅助函数来最小化样板文件。Bash提供了一个名为FUNCNAME的数组,它为调用堆栈中的所有函数命名。${FUNCNAME[0]}为当前函数名,${FUNCNAME[1]}为主叫函数。

helper() {
. mydir/"${FUNCNAME[1]}"
}
a() { helper; }
b() { helper; }
c() { helper; }

如果名称是动态的,您可以谨慎地冒险使用eval:

cd mydir/
for file in *; do
[[ $file =~ ^[a-z]+$ ]] || continue
eval "$file() { helper; }"
done

我在那里放了一个验证检查来跳过任何怪异的文件名。我们不希望被包含;||之类的文件名引入歧途。

相关内容

  • 没有找到相关文章

最新更新