【问题标题】:Indirect expansion returns variable name instead of value间接扩展返回变量名而不是值
【发布时间】:2019-11-07 14:42:10
【问题描述】:

我正在尝试使用间接扩展设置一些变量。根据我阅读的文档,设置应该很简单:

var1=qa
qa_num=12345
varname="${var1}_ci"

echo ${!varname}

我应该得到“12345”。相反,输出是“varname”。如果我删除感叹号,我会得到“qa_ci”,而不是“12345”

这应该是一个相对简单的解决方案,所以我不确定我错过了什么,如果有的话。

【问题讨论】:

    标签: linux bash variables variable-names indirection


    【解决方案1】:

    您的代码定义了qa_num,但varname 的赋值引用了qa_ci。结果,您的 echo 正在扩展不存在的 qa_ci,结果为空。更改 varname 分配可以解决我系统上的问题。

    例如:foo.sh:

    #!/bin/bash
    var1=qa
    qa_num=12345
    varname="${var1}_num"     # <=== not _ci
    
    echo "${!varname}"        # I also added "" here as a general good practice
    

    输出:

    $ bash foo.sh
    12345
    

    【讨论】:

    • 这行得通,尽管我应该提到错字只存在于这个问题上,而不是实际的代码。在那张纸条上,我在 linux 控制台中尝试了这些行,但它们不起作用。只有当我用它创建了一个实际的脚本时。为什么会有所不同?
    • @SVill 我不确定。在我的 Cygwin bash 中,foo.sh 的四行在控制台中一次运行一行,结果是 12345,正如它们应该的那样。但是,更复杂的脚本(例如,依赖于 shopt 设置的脚本)有时在 shell 中的行为会有所不同。我建议用一个最小的、可测试的行为差异示例提出一个新问题。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2018-04-22
    • 2014-04-08
    • 2019-09-18
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多