我需要在我的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
我在那里放了一个验证检查来跳过任何怪异的文件名。我们不希望被包含;
和||
之类的文件名引入歧途。