如何在bash脚本中使用变量变量名

时间:2017-02-08 21:38:32

标签: bash shell

我正在尝试将一些php变量的值放入bash脚本中以设置其他bash变量。基本上我需要能够访问变量 - 变量名称的值。

脚本可以找到&读取文件,找到php变量,但是当我尝试设置它们时它只是挂起。这就是我所拥有的:

variables=(database_user database_password dbase);

paths=(modx_core_path modx_connectors_path modx_manager_path modx_base_path);

for index in "${variables[@]}"; do
index=\$$index
echo $index;
$index="$(grep -oE '\$${!index} = .*;' $config | tail -1 | sed 's/$${!index} = //g;s/;//g')";
done

不确定我在这里做错了什么......

1 个答案:

答案 0 :(得分:2)

您正在尝试执行间接分配。

你应该摆脱这两行:

index=\$$index
echo $index;

简单地写:

echo "${!index}"

干净地进行间接扩展(给出变量名称包含在变量index中的变量的值)。

接下来,有问题的一行就是这个:

$index="$(grep -oE '\$${!index} = .*;' ... (rest omitted)

在Bash中,作业不能以$开头。

您可以执行间接分配的一种方法是(按照上面的建议删除index重新分配后):

printf -v "$index" "$(grep -oE '\$${!index} = .*;' ... (rest omitted)

这使用-v的{​​{1}}选项,这会将作为最终参数传递的值分配给变量,该变量的名称将传递给printf选项。

还有其他处理间接分配/扩展的方法,其中一些方法具有代码注入风险,因为它们使用(可能不受控制的)数据作为代码。这是您可能希望进一步研究的内容。

请注意我假设实际的-v命令替换有效(我还没有测试过)。