【问题标题】:how to use variable variable names in bash script [duplicate]如何在bash脚本中使用变量变量名[重复]
【发布时间】:2017-02-08 21:38:31
【问题描述】:

我正在尝试将一些 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

不知道我在这里做错了什么......

【问题讨论】:

  • @123,请不要建议ABS作为参考;它因展示不良做法而臭名昭著。 BashFAQ #6 是对间接变量的更新和积极维护的讨论。

标签: bash shell


【解决方案1】:

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

你应该去掉这两行:

index=\$$index
echo $index;

通过简单的写作:

echo "${!index}"

哪个干净地进行间接扩展(为您提供名称包含在变量 index 中的变量的值)。

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

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

在 Bash 中,分配不能以 $ 开头。

您可以执行间接分配的一种方法是(在删除index 重新分配后如上所述):

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

这使用printf-v 选项,这会将作为最后一个参数传递的值分配给一个变量,该变量的名称将传递给-v 选项。

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

请注意,我假设实际的 grep 命令替换有效(我尚未测试)。

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2016-09-24
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多